From 3d239a546754e4ac06ed541fcd5b35da609f545b Mon Sep 17 00:00:00 2001 From: sandeepkrs Date: Fri, 4 Sep 2026 15:16:06 +0530 Subject: [PATCH 1/9] Upgrade/pdfbox 2.0.37 (#1) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * docs: add PDFBox 2.0.27 -> 2.0.37 upgrade plan Co-Authored-By: Claude * Vendor jp2-android AAR to restore the build The com.gemalto.jp2:jp2-android:1.0.3 artifact is no longer resolvable: JCenter redirects to Maven Central where the artifact does not exist. Vendor the AAR (BSD-2-Clause, (c) 2018 Gemalto s.r.o., unmodified) into library/libs/ and sample/libs/ and switch both modules to file dependencies. README updated with attribution and new usage. Also drop -XX:MaxPermSize from org.gradle.jvmargs: JDK 17 refuses to start the daemon with it (JDK 11 only warned). Verified: ./gradlew build test on JDK 17. BASELINE-0 (pre-existing unit failures on untouched code): 20 tests in pdmodel.interactive.form fail because the test JVM cannot download remote fixtures behind TLS-intercepting AV; environmental, unrelated to this change. Co-Authored-By: Claude * Bump BouncyCastle jdk15to18 1.73 -> 1.85 family; raise library language level to 1.8 bcprov 1.85.2, bcpkix 1.85, bcutil 1.85.1 (per-artifact latest of the same 1.85 release family; BC only publishes patch revisions for jars that changed). compileOptions 1_7 -> 1_8 to match the sample module and modern dependency bytecode. Gate: build test -> 497 tests, failure set byte-identical to BASELINE-0 (20 known environmental TLS-fixture failures). Recorded as BASELINE-1. Co-Authored-By: Claude * Update fontbox Unicode Scripts.txt to 15.1.0 (upstream 2.0.37) Upstream upgraded the script data from Unicode 10.0.0 (2017) to 15.1.0 (2023): ~440 changed mapping lines, 2693 -> 3033 lines. Byte-copied from the 2.0.37 source distribution. Gate: unit tests, failure set identical to BASELINE-1. Co-Authored-By: Claude * Upgrade PDFBox API to 2.0.37 (1/10): fontbox — sync 41 changed files, add CMapStrings Merge upstream fontbox changes from Apache PDFBox 2.0.27 to 2.0.37: - cmap: new CMapStrings string table (byte-dedup for 1-2 byte codes, PDFBOX-5850); CMap.addCharMapping uses it; CMapParser.createStringFromBytes delegates to it; LiteralName dict-key comparison fix; increment() guard against negative position (PDFBOX-4661 follow-up) - cff: CFFParser PDFBOX-5843 (defer "Private" entry validation for CIDFonts, tolerate empty entries); Type1CharString method renames (setCurrentPoint/callOtherSubr) + PDFBOX-5339 accent path caching - ttf: GlyphTable/GlyfCompositeDescript recursion level guard for self-referencing composite glyphs; unmodifiable getComponents() view; TTFParser/GlyphData/TTFSubsetter etc. accumulated fixes; GlyphRenderer trace-level guards - autodetect: WindowsFontDirFinder drops cmd.exe exec in favor of System.getenv (irrelevant on Android but kept in sync) - Android deltas preserved: PDFBoxResourceLoader cmap/Scripts.txt loading (CMapParser, OpenTypeScript), Path.op union in seac, inner Point class and Path.close in GlyphRenderer, dropped CentOS X11 dir Unit tests: failure set identical to baseline (20 known environmental TLS failures; 497 tests, 446 pass, 31 skipped). Co-Authored-By: Claude * Upgrade PDFBox API to 2.0.37 (2/10): cos/io/parser/writer — sync 29 files, add StringUtil Merge upstream cos, io, pdfparser, pdfwriter and util changes from Apache PDFBox 2.0.27 to 2.0.37: - cos: COSName reworked to byte-based identity (PDF 32000-1 §7.3.5: names are byte sequences, not UTF-8 strings; ByteBuffer-keyed canonical maps, getPDFName(byte[]) factory); COSString hex parsing via Hex.getHexValue with FORCE_PARSING leniency; COSDictionary null-safety in getKeyForValue and toString recursion guards; all 22 new COSName constants taken (556 total, matches upstream) - pdfparser: BaseParser recursion depth guard (max 500, PDFBOX-5788), lenient missing dictionary close, skipLinebreak refactor, checkForEndOfString LF variants, decodeBuffer with Windows-1252 alternative charset, PDFBOX-5025 "NNNendobj" number catch; COSParser validateStreamLength rewrite (zero/negative length, PDFBOX-5954/5880), xref parsing via new StringUtil.splitOnSpace, object-stream ArrayList without attacker-controlled capacity; PDFStreamParser close(), nested inline image rejection (PDFBOX-6038), isolated '+' handling (PDFBOX-5906), ReDoS-safe number pattern - pdfwriter: COSWriter incremental-update xref/size handling, detectPossibleSignature (PDFBOX-5521), SHA-256 document ID instead of MD5 - util: new StringUtil (splitOnSpace); Hex.getHexValue fast path; Matrix javadoc; FileTypeDetector/SmallMap/IterativeMergeSort sync - io: ScratchFile/ScratchFileBuffer sync Forward-ported from multipdf (lands fully in batch 9): the upstream "Tx".equals() fix in PDFMergerUtility.mergeFields — the old == identity comparison silently skipped field joining now that COSName names are byte-decoded strings (also fixes upstream's duplicated destField operand). Android deltas preserved: PDFBoxResourceLoader absent (loader sites live in pdmodel/font, merged later), port IOUtils.closeAndLogException 3-arg signature, e.getMessage() in exception logging. Unit tests: failure set identical to baseline (20 known environmental TLS failures; 497 tests, 446 pass, 31 skipped). Co-Authored-By: Claude * Upgrade PDFBox API to 2.0.37 (3/10): pdmodel core — root, common, fixup Merge upstream 2.0.27→2.0.37 changes into pdmodel root/common/fixup (32 files) plus graphics/state closure pair pulled in by the compile rule (PDSoftMask, PDExtendedGraphicsState). Port deltas preserved: - PDDocument: Android static-init block (kept, upstream's WritableRaster/UnsatisfiedLinkError voodoo dropped), 3-arg IOUtils.closeAndLogException, Log.x(tag, msg, e) exception logging - PDAbstractContentStream / PDPageContentStream / PDAppearanceContentStream: AWTColor signatures; dropped colorspaces (Pattern/Separation/DeviceN) stay commented with // TODO: PdfBox-Android; Path.FillType winding rules (fill + deprecated clipPath) - PDResources: cache condition keeps PDPattern exclusion comment - PDRectangle: PointF-based path construction + path.close() - PDExtendedGraphicsState: Paint.Cap/Paint.Join getters Upstream taken: addSignature restructure + subsetDesignatedFonts() in all save paths (PDDocument), beginMarkedContent + MCID simplified notation, PDResources directFontCache + 3-arg ctor wiring (ResourceCache through PDExtendedGraphicsState/PDSoftMask), TABLOID page size + huge-value clamping (PDRectangle), getCOSArray/getCOSName patterns, PDFBOX-5890/6214-era fixes. Gates: compile green; unit tests 497/446 pass, failure set identical to BASELINE-1 (20 environmental TLS failures); eol audit clean. Co-Authored-By: Claude * Upgrade PDFBox API to 2.0.37 (4/10): documentinterchange, encryption, fdf Merge upstream 2.0.27→2.0.37 changes into pdmodel documentinterchange (12 files), encryption (9), fdf (18); 39 files total. Port deltas preserved: - SecurityProvider: remove Android-provided BouncyCastle provider before registering our own (invariant); upstream's reflection-free direct construction taken, try/catch chain dropped with it - FDFAnnotation + Circle/Line/Polygon/Polyline/Square: AWTColor in place of java.awt.Color for color/interiorColor APIs; upstream's new shared getColor(COSName) helper typed as AWTColor - PDStructureTreeRoot / StandardSecurityHandler: "Log instance." javadoc removed, Log.e tag/msg/throwable form Upstream taken: PDStructureTreeRoot getClassMap/setClassMap (ClassMap support, PDFBOX-4695-era), parent-tree javadoc; StandardSecurityHandler RANDOM static SecureRandom + encryptionVersion local caching + determineEncryptionKey restructure; SaslPrep, PDEncryption, SecurityHandlerFactory/PublicKeySecurityHandler fixes; FDFDictionary / FDFField / FDFDocument updates. Gates: compile green; unit tests 497/446 pass, failure set identical to BASELINE-1 (20 environmental TLS failures); eol audit clean. Co-Authored-By: Claude * Upgrade PDFBox API to 2.0.37 (5/10): pdmodel/graphics — color, image, shading, state Merge upstream 2.0.27→2.0.37 changes into pdmodel/graphics (24 files) plus filter/DecodeResult closure (JPXSMask carrier for the new lazy JPX init). 19 files auto-merged (tx37), 22 manual merges; 14 upstream-changed files that were dropped in this port (8 color spaces, PNGConverter, 5 shading contexts/paints) stay dropped. Port deltas preserved: - PDColorSpace: DeviceRGB fallbacks with Log.e for dropped spaces (Pattern/CalGray/CalRGB/DeviceN/Indexed/Separation/Lab); Bitmap-based abstract toRGBImage; toRawImage/toRGBImageAWT stay commented - PDICCBased: no ICC_Profile/awt — upstream cache restructure grafted into 3-space-indented port body - PDJPXColorSpace: android.graphics.ColorSpace with SDK>O guard; new upstream toRGB implemented via Color.valueOf/convert (API 26+) - PDImageXObject: BitmapFactory rewrite kept; applyMask/scaleImage Bitmap mechanics kept. Upstream's PDFBOX-5375 ctor skip-decode replaced by upstream's final lazy initJPXValues() design (better: enables PDFBOX-5657 SMaskInData via DecodeResult.getJPXSMask) - SampledImageReader: fromAny/applyColorKeyMask stay dropped; upstream wrapped-stream close fix applied to getStencilImage - PDGraphicsState: Region/GraphicsUtil mechanics kept; upstream clippingCache→single-slot clippingPathCache restructure + textMatrix/ textLineMatrix fields/accessors taken; Paint.Cap/Join getters kept - Shading: toPaint stays commented (TODO: PdfBox-Android); PointF/RectF bodies kept; upstream stream-close/abort-on-bad-flag/vertex-locals/ readVertex-validation fixes grafted Upstream taken: getCOSArray casts throughout shading, PDShadingType4 abort on broken stream/bad flag, PDShadingType5 lattice vertex locals + list capacity, ShadedTriangle calcColor restructure, PDOutputIntent getCOSStream + javadoc, CCITTFactory TIFF FillOrder=2 support (fliptable) + bos capacity. Gates: compile green; unit tests 497/446 pass, failure set identical to BASELINE-1 (20 environmental TLS failures); eol audit clean. Co-Authored-By: Claude * Upgrade PDFBox API to 2.0.37 (6/10): pdmodel/font — sync 19 files Auto-synced (11): PDCIDFont, PDCIDFontType2, PDCIDFontType2Embedder, PDFont, PDFontDescriptor, PDTrueTypeFont, PDTrueTypeFontEmbedder, PDType1FontEmbedder, PDType3CharProc, DictionaryEncoding, MacOSRomanEncoding. Manual merges (8): - FileSystemFontProvider: re-apply FontLoadLevel gating (NONE/MINIMUM loads only DroidSans variants; FULL loads all) into the upstream 2.0.37 ctor restructure. - FontMapperImpl: re-apply the 12 Android substitute mappings and the PDFBoxResourceLoader-based fontdir.properties loading. - PDSimpleFont/PDType0Font: keep noUnicode guard (buildging '.notdef'-safe widths) around the upstream null-uni handling. - PDType3Font, PDType1CFont: upstream sync; port Type1CharString returns RectF so getBounds().height() replaces getHeight(). - TrueTypeEmbedder: take upstream TABLES constant, LinkedHashSet subset order, Charsets.US_ASCII ttcf check, os2 local, force- invisible ZWSP/WJ removal, getSubsetCodePoints(); keep RectF computeBounds for cap height / x-height paths. - GlyphList: take upstream put-then-warn duplicate handling and merged uniXXXX/uXXXX parser; keep PDFBoxResourceLoader asset loading fallback. Gates: compileDebugJavaWithJavac green; testDebugUnitTest 497 tests, 20 failed / 31 skipped - failure set identical to BASELINE-1 (known Norton PKIX environmental failures); eol audit clean. Co-Authored-By: Claude * Upgrade PDFBox API to 2.0.37 (7/10): contentstream — sync 20 files + OCG test Auto-synced (16, tx37 verbatim — Android deltas were import-order only): PDCID-style operator classes SetNonStrokingDevice{CMYK,Gray,RGB}Color, SetStrokingDevice{CMYK,Gray,RGB}Color, SetNonStrokingColorSpace, SetStrokingColorSpace (new isShouldProcessColorOperators guard), CurveToReplicateFinalPoint, DrawObject, ShadingFill, BeginInlineImage, BeginMarkedContentSequenceWithProperties, SetLineWidth, SetLineMiterLimit, SetFontAndSize. Manual merges (4): - PDFStreamEngine: take upstream text-matrix-in-graphics-state rework (drops engine-level textMatrix/textLineMatrix fields), uncolored tiling pattern + Type3 d1 color-operator suppression (PDFBOX-5235/5361 era), soft-mask DeviceGray reset, PDFBOX-6095 zero-size appearance guard, DataFormatException operator forgiveness; keep port RectF computeBounds mechanics for the annotation appearance box and tiling pattern bbox. - SetLineCapStyle/SetLineJoinStyle: new checkArrayTypesClass guard + port Paint.Cap/Paint.Join enum switches. - SetColor: upstream PDFBOX-5851 invalid-color fallback; keep port Pattern-colorspace condition comment-out (PDPattern dropped). Unit test: TestOptionalContentGroups.testOCGConsumption updated to upstream PDFBOX-5980 expectations (BDC tag is first operand 'OC'; group name now asserted via PDPropertyList.create on the resolved property dict instead of the old last-COSName-wins tag). Gates: compileDebugJavaWithJavac green; testDebugUnitTest 497 tests, 20 failed / 31 skipped - failure set identical to BASELINE-1 (known Norton PKIX environmental failures); eol audit clean. Co-Authored-By: Claude * Upgrade PDFBox API to 2.0.37 (8/10): filter — sync 12 files Auto-synced (8, tx37 verbatim): ASCIIHexFilter, CCITTFaxDecoderStream, CCITTFaxEncoderStream, CCITTFaxFilter, CryptFilter, Predictor, RunLengthDecodeFilter, LZWFilter (delta was only an orphaned 'Log instance.' javadoc remnant). Manual merges (4): - Filter: take SYSPROP_CCITTFAX_MAXBYTES DoS cap constant; keep both javax.imageio reader finders (findImageReader, new findRasterReader) commented out per port policy (TODO: PdfBox-Android). - DecodeResult: upstream JPX SMask getter/setter — already carried in the C7 merge (Bitmap form); no change needed. - JPXFilter: keep gemalto JP2Decoder reflection guard + Bitmap pixel loop; add upstream PDFBOX-5657 SMaskInData handling in Android form (Bitmap.extractAlpha() into DecodeResult.setJPXSMask; opaque image rebuilt on an RGB_565 canvas before color-space extraction, SDK_INT > O as before). - DCTFilter: stays a pure passthrough — all pb37 changes (findRasterReader, readImageRaster CMYK strategy, CMMException wrap, YCbCr/YCCK fixes) are javax.imageio-based and not portable; the commented-out raster helpers remain marked TODO: PdfBox-Android. Gates: compileDebugJavaWithJavac green; testDebugUnitTest 497 tests, 20 failed / 31 skipped - failure set identical to BASELINE-1 (known Norton PKIX environmental failures); audit + eol clean. Co-Authored-By: Claude * Upgrade PDFBox API to 2.0.37 (9/10): pdmodel/interactive — sync 48 files Auto-synced (33, tx37 verbatim): action/* (7), digitalsignature/* (4), documentnavigation/outline/PDOutlineNode + PDOutlineItemIterator, form/{PDButton, PDChoice, PDComboBox, PDField, PDFieldFactory, PDNonTerminalField, PDSignatureField, PDTextField, PDTerminalField, PDVariableText, ScriptingHandler, PDFieldTree}, viewerpreferences/ PDViewerPreferences, annotation/{PDAnnotationPopup, PDAnnotationLine, PDAnnotationSquareCircle, PDBorderStyleDictionary, PDAnnotationMarkup}, handlers/{AnnotationBorder, PDAbstractAppearanceHandler, PDAnnotationAdditionalActions(no-op)}, PlainText x2 (import order only). Manual merges (15): - PDAcroForm: upstream flatten/rotate rework; keep port RectF computeBounds appearance-box mechanics. - AppearanceGeneratorHelper: keep PointF .x/.y + RectF computeBounds for text-height path measurement. - PDTextAppearanceHandler: upstream 139-line rework kept; port stub for addPath retained (Android Path segments not retrievable), 3-arg Log.e exception form. - Appearance handlers (Caret, FreeText, Highlight, Link, Line, Polyline, FileAttachment): Log.e(msg, e) -> Log.e(msg, e) 3-arg port form. - PDOutlineItem: AWTColor setTextColor signature kept. Gates: compileDebugJavaWithJavac green; testDebugUnitTest 497 tests, 20 failed / 31 skipped - failure set identical to BASELINE-1; audit + eol clean. Co-Authored-By: Claude * Upgrade PDFBox API to 2.0.37 (10/10): multipdf + text — sync 8 files Auto-synced (6, tx37 verbatim): Splitter (673 upstream lines: page info / bookmark-tree merge rework), Overlay, TextPosition, PDFTextStripperByArea, PDFMarkedContentExtractor + LayerUtility (import order only). Post-fixes on auto-applied files: Overlay + LayerUtility replace upstream's new AffineTransform.quadrantRotate(N) with the port's rotate() equivalents (harmony AffineTransform lacks quadrantRotate; rotate(-PI/2)/rotate(-PI)/rotate(-1.5PI) are the same transforms mod 2*PI). Manual merges (2): - PDFTextStripper: take upstream 214-line rework (Bidi, article thread, sort improvements); re-apply PDFBoxResourceLoader block for BidiMirroring.txt asset loading. - PDFMergerUtility: take upstream 216-line merge rework incl. the "Tx".equals(srcField/destField) fix (matches port's old local fix); keep port 3-arg IOUtils.closeAndLogException signature. Gates: compileDebugJavaWithJavac green; testDebugUnitTest 497 tests, 20 failed / 31 skipped - failure set identical to BASELINE-1; audit + eol clean. Co-Authored-By: Claude * Upgrade PDFBox API to 2.0.37: rendering — sync 3 files PageDrawer (24 upstream hunks, grafted onto Android implementation): - PDFBOX-5782: null colorspace in getColor() renders transparent instead of throwing NPE (port returns android Color.argb(0,0,0,0) + Log.e) - PDFBOX-5611: ignore zero-width displacement in drawGlyph2D stretch - PDFBOX-5653: clamp dash phase to Short.MAX_VALUE after transformWidth - getDashArray(): drop phase infinite/NaN early-return (superseded by the phase clamp) - PDFBOX-5307: image-dictionary Mask/SMask overrides graphics-state soft mask — drawBitmap() now takes the PDImage and guards the (stubbed) soft-mask branch so masked images render instead of being dropped - shouldSkipAnnotation(): destination-aware skip logic (PRINT/unprinted, VIEW+EXPORT/noView, hidden, invisible unknown, hidden OCG) replacing the old device-check comment - PDFBOX-4744: noRotate annotations with transparency groups get their appearance reconstructed; appearance restored after render - hasTransparency(PDFormXObject): recursive transparency-group detection - hasBlendMode(): blendModeMap memoization (COSStream-keyed cache) from upstream performance fix - getSubsampling(): private -> protected + upstream javadoc PDFRenderer: upstream @throws javadoc additions (IllegalStateException / IndexOutOfBoundsException) — applied to all 10 render overloads (7 upstream + 3 port Canvas variants). TTFGlyph2D: PDFBOX-5567 cached-path copy — android.graphics.Path has no public clone(), use new Path(path) constructor. Skipped (AWT-only, tied to stubbed port paths): adjustClip thin-line enlargement, printer/IS_WINDOWS workaround, stencil-pixel handling, drawBufferedImage quality-prescale workaround, SoftMask.java / TilingPaint.java (dropped files — pure java.awt Paint/Raster machinery, stay dropped per port scope). Gates: compileDebugJavaWithJavac clean; audit greps clean; testDebugUnitTest 497/20/31 — failure set identical to baseline; build :library:test same 20 environmental (Norton PKIX) failures; eol audit clean. Co-Authored-By: Claude * Upgrade PDFBox API to 2.0.37: androidTest sync — 11 tests + 7 resources Syncs upstream's 2.0.27→2.0.37 instrumentation-test changes, adapted to the port's conventions (asset loads, TestResourceGenerator downloads, TestRendering comparisons instead of TestPDFToImage): - ValidateXImage/JPEGFactory/LosslessFactory/PDImageXObject/CCITT: getOpaqueImage() -> getOpaqueImage(null, 1), explicit stream close handling, document.close() after doWritePDF, assertArrayEquals on toByteArray in checkJpegStream. Port keeps PDDeviceRGB expectations for CMYK/gray JPEGs (Android Bitmap decode) with existing TODO marks. - TestPublicKeyEncryption: assertEquals JCE-strength form; testProtectionError drops the leak-prone finally-close dance. - TestSymmetricKeyEncryption: checkSeveralPerms() fold with InvalidPasswordException catch; closeQuietly in byte[] helpers; new testPDFBox5955 (RC4 40/48-bit, downloads) and testPDFBox5639 (AESV3 R=5 excess bytes, downloads). - PDFontTest: explicit InputStream+close for PDType1Font load; new PDFBOX5920Type0/PDFBOX5920TrueType space-width tests (assets), testSymbol round-trip, testPDFBox6172 CID!=GID IllegalStateException (downloads NotoSansSC otf). - CombAlignmentTest: setValue("") warm-up per upstream; new testPDFBOX5784 (resource added). - PDAcroFormFlattenTest: testFlattenPDFBox4889 replaced by flattenTestPDFBOX5254 (fields empty + 72 annotations); new flattenTestPDFBOX5225 (orphan widget, 76 fields / 59 annotations). - PDFMergerUtilityTest: checkWithNumberTree 2025 expansion (MCID coverage), checkElement 3-arg rework (/P back-reference, OBJR/MCR /Pg guard, /Link subtype), checkParentTreeAgainstK-adjacent caller updates, ElementCounter PDFBOX-6009 K-array branch, testFileDeletion InputStream coverage; 11 new split/merge tests (PDFBOX-5762/5792/5809/5811/5840/5929/6009/6018/5939) — 6 new resource PDFs vendored from upstream test resources. testPDFBox515 left as commented stub (sources ship as a zip maven unpacks; TestResourceGenerator cannot unpack archives). testFillOrder2 (CCITT) left as commented stub (downloads TIFF + javax.imageio reference decode). Gates: compileDebugAndroidTestJavaWithJac clean; unit test set unchanged (497/20/31, same 20 environmental failures); eol audit clean. Co-Authored-By: Claude * Upgrade PDFBox API to 2.0.37: release metadata - gradle.properties: VERSION_NAME 2.0.27.1-SNAPSHOT -> 2.0.37.0-SNAPSHOT - README: dependency coordinate 2.0.27.0 -> 2.0.37.0; "Currently based on PDFBox v2.0.27" -> v2.0.37 Final gate: clean build; :library:test 497 tests / 20 failed / 31 skipped — failure set identical to pre-upgrade baseline (all 20 are Norton PKIX environmental failures, unrelated to the merge); :sample:assembleDebug produces sample-debug.apk; audit suite clean (zero org.apache.pdfbox/fontbox refs, zero commons-logging, zero LOG. calls, 70 port TODO markers, eol audit clean). 17 commits on upgrade/pdfbox-2.0.37. Co-Authored-By: Claude * Bug fixes --------- Co-authored-by: Claude --- README.md | 9 +- gradle.properties | 4 +- library/build.gradle | 12 +- library/libs/jp2-android-1.0.3.aar | Bin 0 -> 668757 bytes .../encryption/TestPublicKeyEncryption.java | 22 +- .../TestSymmetricKeyEncryption.java | 124 +- .../pdfbox/multipdf/PDFMergerUtilityTest.java | 506 +- .../pdfbox/pdmodel/font/PDFontTest.java | 96 +- .../graphics/image/CCITTFactoryTest.java | 7 + .../graphics/image/JPEGFactoryTest.java | 14 +- .../graphics/image/LosslessFactoryTest.java | 12 +- .../graphics/image/PDImageXObjectTest.java | 29 +- .../image/SampledImageReaderTest.java | 128 + .../graphics/image/ValidateXImage.java | 2 +- .../interactive/form/CombAlignmentTest.java | 27 + .../form/PDAcroFormFlattenTest.java | 76 +- .../fontbox/resources/unicode/Scripts.txt | 5726 +++++++++-------- .../com/tom_roush/fontbox/afm/AFMParser.java | 108 +- .../com/tom_roush/fontbox/cff/CFFCIDFont.java | 25 +- .../com/tom_roush/fontbox/cff/CFFParser.java | 185 +- .../tom_roush/fontbox/cff/CFFType1Font.java | 9 +- .../fontbox/cff/Type1CharString.java | 15 +- .../fontbox/cff/Type1CharStringParser.java | 14 +- .../tom_roush/fontbox/cff/Type1FontUtil.java | 7 +- .../fontbox/cff/Type2CharString.java | 99 +- .../java/com/tom_roush/fontbox/cmap/CMap.java | 42 +- .../tom_roush/fontbox/cmap/CMapParser.java | 366 +- .../tom_roush/fontbox/cmap/CMapStrings.java | 117 + .../com/tom_roush/fontbox/pfb/PfbParser.java | 120 +- .../tom_roush/fontbox/ttf/CmapSubtable.java | 93 +- .../fontbox/ttf/GlyfCompositeComp.java | 35 +- .../fontbox/ttf/GlyfCompositeDescript.java | 53 +- .../tom_roush/fontbox/ttf/GlyfDescript.java | 39 +- .../fontbox/ttf/GlyfSimpleDescript.java | 38 +- .../com/tom_roush/fontbox/ttf/GlyphData.java | 7 +- .../fontbox/ttf/GlyphDescription.java | 35 +- .../tom_roush/fontbox/ttf/GlyphRenderer.java | 10 +- .../fontbox/ttf/GlyphSubstitutionTable.java | 194 +- .../com/tom_roush/fontbox/ttf/GlyphTable.java | 24 +- .../fontbox/ttf/IndexToLocationTable.java | 6 +- .../fontbox/ttf/KerningSubtable.java | 13 +- .../fontbox/ttf/MaximumProfileTable.java | 35 +- .../fontbox/ttf/MemoryTTFDataStream.java | 21 +- .../com/tom_roush/fontbox/ttf/NameRecord.java | 16 +- .../tom_roush/fontbox/ttf/NamingTable.java | 118 +- .../tom_roush/fontbox/ttf/OpenTypeFont.java | 29 +- .../tom_roush/fontbox/ttf/OpenTypeScript.java | 296 +- .../fontbox/ttf/PostScriptTable.java | 11 +- .../tom_roush/fontbox/ttf/TTFDataStream.java | 21 +- .../com/tom_roush/fontbox/ttf/TTFParser.java | 28 +- .../tom_roush/fontbox/ttf/TTFSubsetter.java | 155 +- .../fontbox/ttf/TrueTypeCollection.java | 5 +- .../tom_roush/fontbox/ttf/TrueTypeFont.java | 33 +- .../fontbox/ttf/VerticalOriginTable.java | 11 +- .../tom_roush/fontbox/type1/Type1Font.java | 32 +- .../tom_roush/fontbox/type1/Type1Lexer.java | 21 +- .../tom_roush/fontbox/type1/Type1Parser.java | 36 +- .../util/autodetect/UnixFontDirFinder.java | 9 +- .../util/autodetect/WindowsFontDirFinder.java | 43 +- .../pdfbox/contentstream/PDFStreamEngine.java | 198 +- .../operator/color/SetColor.java | 7 +- .../color/SetNonStrokingColorSpace.java | 11 +- .../color/SetNonStrokingDeviceCMYKColor.java | 5 +- .../color/SetNonStrokingDeviceGrayColor.java | 5 +- .../color/SetNonStrokingDeviceRGBColor.java | 5 +- .../operator/color/SetStrokingColorSpace.java | 11 +- .../color/SetStrokingDeviceCMYKColor.java | 5 +- .../color/SetStrokingDeviceGrayColor.java | 6 +- .../color/SetStrokingDeviceRGBColor.java | 6 +- .../operator/graphics/BeginInlineImage.java | 13 +- .../graphics/CurveToReplicateFinalPoint.java | 19 +- .../operator/graphics/DrawObject.java | 8 +- .../operator/graphics/ShadingFill.java | 12 +- ...inMarkedContentSequenceWithProperties.java | 47 +- .../operator/state/SetLineCapStyle.java | 5 +- .../operator/state/SetLineJoinStyle.java | 5 +- .../operator/state/SetLineMiterLimit.java | 6 +- .../operator/state/SetLineWidth.java | 5 +- .../operator/text/SetFontAndSize.java | 10 +- .../com/tom_roush/pdfbox/cos/COSArray.java | 24 +- .../tom_roush/pdfbox/cos/COSDictionary.java | 22 +- .../com/tom_roush/pdfbox/cos/COSDocument.java | 23 +- .../com/tom_roush/pdfbox/cos/COSFloat.java | 10 +- .../tom_roush/pdfbox/cos/COSInputStream.java | 51 +- .../com/tom_roush/pdfbox/cos/COSInteger.java | 7 +- .../com/tom_roush/pdfbox/cos/COSName.java | 202 +- .../com/tom_roush/pdfbox/cos/COSNumber.java | 7 +- .../com/tom_roush/pdfbox/cos/COSObject.java | 9 +- .../com/tom_roush/pdfbox/cos/COSString.java | 70 +- .../tom_roush/pdfbox/cos/PDFDocEncoding.java | 5 +- .../pdfbox/filter/ASCIIHexFilter.java | 73 +- .../pdfbox/filter/CCITTFaxDecoderStream.java | 273 +- .../pdfbox/filter/CCITTFaxEncoderStream.java | 6 +- .../pdfbox/filter/CCITTFaxFilter.java | 94 +- .../tom_roush/pdfbox/filter/CryptFilter.java | 9 +- .../tom_roush/pdfbox/filter/DecodeResult.java | 13 + .../com/tom_roush/pdfbox/filter/Filter.java | 78 +- .../tom_roush/pdfbox/filter/JPXFilter.java | 14 + .../tom_roush/pdfbox/filter/LZWFilter.java | 181 +- .../tom_roush/pdfbox/filter/Predictor.java | 13 +- .../pdfbox/filter/RunLengthDecodeFilter.java | 115 +- .../com/tom_roush/pdfbox/io/ScratchFile.java | 63 +- .../pdfbox/io/ScratchFileBuffer.java | 50 +- .../pdfbox/multipdf/LayerUtility.java | 64 +- .../tom_roush/pdfbox/multipdf/Overlay.java | 242 +- .../pdfbox/multipdf/PDFMergerUtility.java | 293 +- .../tom_roush/pdfbox/multipdf/Splitter.java | 716 ++- .../pdfbox/pdfparser/BaseParser.java | 463 +- .../tom_roush/pdfbox/pdfparser/COSParser.java | 243 +- .../pdfbox/pdfparser/InputStreamSource.java | 9 +- .../tom_roush/pdfbox/pdfparser/PDFParser.java | 31 +- .../pdfbox/pdfparser/PDFStreamParser.java | 148 +- .../pdfbox/pdfparser/PDFXrefStreamParser.java | 31 +- .../pdfbox/pdfparser/RandomAccessSource.java | 10 +- .../pdfbox/pdfparser/SequentialSource.java | 10 +- .../tom_roush/pdfbox/pdfwriter/COSWriter.java | 171 +- .../pdfbox/pdfwriter/ContentStreamWriter.java | 78 +- .../pdmodel/PDAbstractContentStream.java | 96 +- .../pdmodel/PDAppearanceContentStream.java | 448 +- .../pdmodel/PDDestinationNameTreeNode.java | 11 +- .../tom_roush/pdfbox/pdmodel/PDDocument.java | 269 +- .../pdfbox/pdmodel/PDDocumentCatalog.java | 35 +- .../pdmodel/PDDocumentNameDictionary.java | 9 +- .../pdmodel/PDEmbeddedFilesNameTreeNode.java | 7 +- .../pdmodel/PDJavascriptNameTreeNode.java | 3 +- .../com/tom_roush/pdfbox/pdmodel/PDPage.java | 24 +- .../pdfbox/pdmodel/PDPageContentStream.java | 78 +- .../tom_roush/pdfbox/pdmodel/PDPageTree.java | 57 +- .../tom_roush/pdfbox/pdmodel/PDResources.java | 42 +- .../PDStructureElementNameTreeNode.java | 6 +- .../pdfbox/pdmodel/common/COSArrayList.java | 14 +- .../pdfbox/pdmodel/common/PDMetadata.java | 15 +- .../pdfbox/pdmodel/common/PDNameTreeNode.java | 24 +- .../pdmodel/common/PDNumberTreeNode.java | 42 +- .../pdfbox/pdmodel/common/PDObjectStream.java | 6 +- .../pdfbox/pdmodel/common/PDPageLabels.java | 11 +- .../pdfbox/pdmodel/common/PDRectangle.java | 21 +- .../pdfbox/pdmodel/common/PDStream.java | 17 +- .../PDComplexFileSpecification.java | 24 +- .../filespecification/PDEmbeddedFile.java | 14 +- .../pdmodel/common/function/PDFunction.java | 26 +- .../common/function/PDFunctionType0.java | 32 +- .../common/function/PDFunctionType2.java | 13 +- .../common/function/PDFunctionType3.java | 21 +- .../type4/InstructionSequenceBuilder.java | 3 +- .../common/function/type4/Operators.java | 3 +- .../PDMarkedContentReference.java | 7 +- .../logicalstructure/PDObjectReference.java | 30 +- .../logicalstructure/PDParentTreeValue.java | 8 +- .../logicalstructure/PDStructureElement.java | 69 +- .../logicalstructure/PDStructureNode.java | 7 +- .../logicalstructure/PDStructureTreeRoot.java | 116 +- .../PDUserAttributeObject.java | 9 +- .../logicalstructure/Revisions.java | 45 +- .../prepress/PDBoxStyle.java | 5 +- .../taggedpdf/PDArtifactMarkedContent.java | 7 +- .../taggedpdf/PDLayoutAttributeObject.java | 5 +- .../taggedpdf/PDStandardAttributeObject.java | 13 +- .../encryption/PDCryptFilterDictionary.java | 9 +- .../pdmodel/encryption/PDEncryption.java | 31 +- .../encryption/PublicKeySecurityHandler.java | 51 +- .../pdfbox/pdmodel/encryption/RC4Cipher.java | 51 +- .../pdfbox/pdmodel/encryption/SaslPrep.java | 596 +- .../pdmodel/encryption/SecurityHandler.java | 144 +- .../encryption/SecurityHandlerFactory.java | 25 +- .../pdmodel/encryption/SecurityProvider.java | 34 +- .../encryption/StandardSecurityHandler.java | 321 +- .../pdfbox/pdmodel/fdf/FDFAnnotation.java | 110 +- .../pdmodel/fdf/FDFAnnotationCaret.java | 14 +- .../pdmodel/fdf/FDFAnnotationCircle.java | 26 +- .../pdmodel/fdf/FDFAnnotationFreeText.java | 22 +- .../pdfbox/pdmodel/fdf/FDFAnnotationInk.java | 15 +- .../pdfbox/pdmodel/fdf/FDFAnnotationLine.java | 61 +- .../pdmodel/fdf/FDFAnnotationPolygon.java | 23 +- .../pdmodel/fdf/FDFAnnotationPolyline.java | 23 +- .../pdmodel/fdf/FDFAnnotationSquare.java | 26 +- .../pdmodel/fdf/FDFAnnotationStamp.java | 47 +- .../pdfbox/pdmodel/fdf/FDFAnnotationText.java | 7 +- .../pdmodel/fdf/FDFAnnotationTextMarkup.java | 9 +- .../pdfbox/pdmodel/fdf/FDFDictionary.java | 37 +- .../pdfbox/pdmodel/fdf/FDFDocument.java | 21 +- .../pdfbox/pdmodel/fdf/FDFField.java | 50 +- .../pdfbox/pdmodel/fdf/FDFIconFit.java | 3 +- .../tom_roush/pdfbox/pdmodel/fdf/FDFPage.java | 3 +- .../pdfbox/pdmodel/fdf/FDFTemplate.java | 5 +- .../AcroFormOrphanWidgetsProcessor.java | 390 +- .../pdmodel/font/FileSystemFontProvider.java | 293 +- .../pdfbox/pdmodel/font/FontMapperImpl.java | 150 +- .../pdfbox/pdmodel/font/PDCIDFont.java | 5 +- .../pdfbox/pdmodel/font/PDCIDFontType2.java | 47 +- .../pdmodel/font/PDCIDFontType2Embedder.java | 226 +- .../tom_roush/pdfbox/pdmodel/font/PDFont.java | 56 +- .../pdfbox/pdmodel/font/PDFontDescriptor.java | 3 +- .../pdfbox/pdmodel/font/PDSimpleFont.java | 35 +- .../pdfbox/pdmodel/font/PDTrueTypeFont.java | 57 +- .../pdmodel/font/PDTrueTypeFontEmbedder.java | 23 +- .../pdfbox/pdmodel/font/PDType0Font.java | 44 +- .../pdfbox/pdmodel/font/PDType1CFont.java | 34 +- .../pdmodel/font/PDType1FontEmbedder.java | 7 +- .../pdfbox/pdmodel/font/PDType3CharProc.java | 13 +- .../pdfbox/pdmodel/font/PDType3Font.java | 26 +- .../pdfbox/pdmodel/font/TrueTypeEmbedder.java | 71 +- .../font/encoding/DictionaryEncoding.java | 27 +- .../pdmodel/font/encoding/GlyphList.java | 66 +- .../font/encoding/MacOSRomanEncoding.java | 33 +- .../pdmodel/graphics/PDLineDashPattern.java | 21 +- .../pdmodel/graphics/color/PDColor.java | 12 +- .../pdmodel/graphics/color/PDColorSpace.java | 22 +- .../pdmodel/graphics/color/PDDeviceCMYK.java | 31 +- .../pdmodel/graphics/color/PDICCBased.java | 32 +- .../graphics/color/PDJPXColorSpace.java | 6 + .../graphics/color/PDOutputIntent.java | 15 +- .../pdmodel/graphics/form/PDFormXObject.java | 20 +- .../pdmodel/graphics/image/CCITTFactory.java | 50 +- .../pdmodel/graphics/image/PDImage.java | 13 +- .../graphics/image/PDImageXObject.java | 113 +- .../pdmodel/graphics/image/PDInlineImage.java | 18 +- .../graphics/image/SampledImageReader.java | 30 +- .../PDOptionalContentGroup.java | 21 +- ...PDOptionalContentMembershipDictionary.java | 158 +- .../PDOptionalContentProperties.java | 54 +- .../shading/PDMeshBasedShadingType.java | 15 +- .../pdmodel/graphics/shading/PDShading.java | 4 +- .../graphics/shading/PDShadingType1.java | 2 +- .../graphics/shading/PDShadingType2.java | 6 +- .../graphics/shading/PDShadingType4.java | 13 +- .../graphics/shading/PDShadingType5.java | 38 +- .../shading/PDTriangleBasedShadingType.java | 12 +- .../graphics/shading/ShadedTriangle.java | 30 +- .../state/PDExtendedGraphicsState.java | 29 +- .../graphics/state/PDGraphicsState.java | 67 +- .../pdmodel/graphics/state/PDSoftMask.java | 39 +- .../action/PDActionEmbeddedGoTo.java | 10 +- .../interactive/action/PDActionLaunch.java | 8 +- .../action/PDActionRemoteGoTo.java | 10 +- .../interactive/action/PDActionSound.java | 3 +- .../action/PDAdditionalActions.java | 3 +- .../action/PDAnnotationAdditionalActions.java | 5 +- .../action/PDFormFieldAdditionalActions.java | 9 +- .../action/PDPageAdditionalActions.java | 3 +- .../interactive/annotation/PDAnnotation.java | 74 +- .../annotation/PDAnnotationLine.java | 11 +- .../annotation/PDAnnotationMarkup.java | 19 +- .../annotation/PDAnnotationPopup.java | 13 +- .../annotation/PDAnnotationSquareCircle.java | 9 +- .../annotation/PDBorderStyleDictionary.java | 8 +- .../annotation/handlers/AnnotationBorder.java | 108 +- .../handlers/PDAbstractAppearanceHandler.java | 35 +- .../handlers/PDCaretAppearanceHandler.java | 32 +- .../PDFileAttachmentAppearanceHandler.java | 224 +- .../handlers/PDFreeTextAppearanceHandler.java | 43 +- .../PDHighlightAppearanceHandler.java | 34 +- .../handlers/PDLineAppearanceHandler.java | 37 +- .../handlers/PDLinkAppearanceHandler.java | 21 +- .../handlers/PDPolylineAppearanceHandler.java | 67 +- .../handlers/PDTextAppearanceHandler.java | 192 +- .../annotation/layout/PlainText.java | 500 +- .../digitalsignature/PDSeedValue.java | 47 +- .../PDSeedValueTimeStamp.java | 11 +- .../visible/PDFTemplateBuilder.java | 33 +- .../visible/PDVisibleSigBuilder.java | 49 +- .../outline/PDOutlineItem.java | 9 +- .../outline/PDOutlineItemIterator.java | 7 +- .../outline/PDOutlineNode.java | 9 +- .../form/AppearanceGeneratorHelper.java | 194 +- .../pdmodel/interactive/form/PDAcroForm.java | 134 +- .../pdmodel/interactive/form/PDButton.java | 124 +- .../pdmodel/interactive/form/PDChoice.java | 49 +- .../pdmodel/interactive/form/PDComboBox.java | 11 +- .../pdmodel/interactive/form/PDField.java | 42 +- .../interactive/form/PDFieldFactory.java | 24 +- .../pdmodel/interactive/form/PDFieldTree.java | 6 +- .../interactive/form/PDNonTerminalField.java | 17 +- .../interactive/form/PDSignatureField.java | 19 +- .../interactive/form/PDTerminalField.java | 3 +- .../pdmodel/interactive/form/PDTextField.java | 4 +- .../interactive/form/PDVariableText.java | 20 +- .../pdmodel/interactive/form/PlainText.java | 114 +- .../interactive/form/ScriptingHandler.java | 68 +- .../PDViewerPreferences.java | 12 +- .../pdfbox/rendering/PDFRenderer.java | 30 + .../pdfbox/rendering/PageDrawer.java | 237 +- .../pdfbox/rendering/TTFGlyph2D.java | 8 +- .../text/PDFMarkedContentExtractor.java | 66 +- .../pdfbox/text/PDFTextStripper.java | 304 +- .../pdfbox/text/PDFTextStripperByArea.java | 7 +- .../tom_roush/pdfbox/text/TextPosition.java | 129 +- .../java/com/tom_roush/pdfbox/util/Hex.java | 42 +- .../pdfbox/util/IterativeMergeSort.java | 9 +- .../com/tom_roush/pdfbox/util/Matrix.java | 27 +- .../pdfbox/util/NumberFormatUtil.java | 15 +- .../com/tom_roush/pdfbox/util/SmallMap.java | 675 +- .../com/tom_roush/pdfbox/util/StringUtil.java | 28 + .../filetypedetector/FileTypeDetector.java | 21 +- .../graphics/color/PDDeviceCMYKTest.java | 27 + .../TestOptionalContentGroups.java | 16 +- .../pdmodel/interactive/form/PDFBOX-5784.pdf | Bin 0 -> 1055136 bytes .../pdfbox/input/merge/PDFBOX-5762-722238.pdf | Bin 0 -> 35644 bytes .../pdfbox/input/merge/PDFBOX-5792-240045.pdf | Bin 0 -> 44295 bytes .../pdfbox/input/merge/PDFBOX-5809-509329.pdf | Bin 0 -> 43516 bytes .../pdfbox/input/merge/PDFBOX-5811-362972.pdf | Bin 0 -> 44338 bytes .../pdfbox/input/merge/PDFBOX-5840-410609.pdf | Bin 0 -> 33084 bytes .../PDFBOX-6018-099267-p9-OrphanPopups.pdf | Bin 0 -> 2116 bytes sample/build.gradle | 11 +- sample/libs/jp2-android-1.0.3.aar | Bin 0 -> 668757 bytes 305 files changed, 14409 insertions(+), 9338 deletions(-) create mode 100644 library/libs/jp2-android-1.0.3.aar create mode 100644 library/src/androidTest/java/com/tom_roush/pdfbox/pdmodel/graphics/image/SampledImageReaderTest.java create mode 100644 library/src/main/java/com/tom_roush/fontbox/cmap/CMapStrings.java create mode 100644 library/src/main/java/com/tom_roush/pdfbox/util/StringUtil.java create mode 100644 library/src/test/resources/pdfbox/com/tom_roush/pdfbox/pdmodel/interactive/form/PDFBOX-5784.pdf create mode 100644 library/src/test/resources/pdfbox/input/merge/PDFBOX-5762-722238.pdf create mode 100644 library/src/test/resources/pdfbox/input/merge/PDFBOX-5792-240045.pdf create mode 100644 library/src/test/resources/pdfbox/input/merge/PDFBOX-5809-509329.pdf create mode 100644 library/src/test/resources/pdfbox/input/merge/PDFBOX-5811-362972.pdf create mode 100644 library/src/test/resources/pdfbox/input/merge/PDFBOX-5840-410609.pdf create mode 100644 library/src/test/resources/pdfbox/input/merge/PDFBOX-6018-099267-p9-OrphanPopups.pdf create mode 100644 sample/libs/jp2-android-1.0.3.aar diff --git a/README.md b/README.md index d408870fb..88f70b67b 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Add the following to dependency to `build.gradle`: ```gradle dependencies { - implementation 'com.tom-roush:pdfbox-android:2.0.27.0' + implementation 'com.tom-roush:pdfbox-android:2.0.37.0' } ``` @@ -36,16 +36,17 @@ Reading JPX Images Android does not come with native support for handling JPX images. These images can be read using the [JP2Android library](https://github.com/ThalesGroup/JP2ForAndroid). As JPX is not a common image format, this library is not included with PdfBox-Android by default. If the JP2Android library is not on the classpath of your application, JPX images will be ignored and a warning will be logged. -To include the JP2Android library, add the following to your project's Gradle `dependencies` section. Note that this library is available in JCenter only, so you will need to add `jcenter()` to your repository list. +To include the JP2Android library in your own application, either build it from its [source repository](https://github.com/ThalesGroup/JP2ForAndroid) or copy the prebuilt AAR vendored in this repository (`sample/libs/jp2-android-1.0.3.aar`) and reference it as a file dependency: ```gradle dependencies { - implementation 'com.gemalto.jp2:jp2-android:1.0.3' + implementation files('libs/jp2-android-1.0.3.aar') } ``` +Note: the library was originally distributed through JCenter, which no longer hosts the artifact. The vendored copy is unmodified and is licensed under the BSD 2-Clause license (Copyright (c) 2018 Gemalto s.r.o., see the [upstream repository](https://github.com/ThalesGroup/JP2ForAndroid) for the full license text). Important notes ============== -* Currently based on PDFBox v2.0.27 +* Currently based on PDFBox v2.0.37 * Requires API 19 or greater for full functionality diff --git a/gradle.properties b/gradle.properties index dad4641be..7290e4ddf 100755 --- a/gradle.properties +++ b/gradle.properties @@ -11,10 +11,10 @@ # The setting is particularly useful for tweaking memory settings. # Default value: -Xmx10248m -XX:MaxPermSize=256m # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m +org.gradle.jvmargs=-Xmx2048m org.gradle.parallel=true -VERSION_NAME=2.0.27.1-SNAPSHOT +VERSION_NAME=2.0.37.0-SNAPSHOT VERSION_CODE=1 ANDROID_BUILD_MIN_SDK_VERSION=14 diff --git a/library/build.gradle b/library/build.gradle index c23a2afee..07604f197 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -45,8 +45,8 @@ android { namespace 'com.tom_roush.pdfbox' compileOptions { - sourceCompatibility JavaVersion.VERSION_1_7 - targetCompatibility JavaVersion.VERSION_1_7 + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 } // Rename the output aars @@ -92,11 +92,11 @@ tasks.withType(Test) { } dependencies { - api "org.bouncycastle:bcprov-jdk15to18:1.73" - api "org.bouncycastle:bcpkix-jdk15to18:1.73" - api "org.bouncycastle:bcutil-jdk15to18:1.73" + api "org.bouncycastle:bcprov-jdk15to18:1.85" + api "org.bouncycastle:bcpkix-jdk15to18:1.85" + api "org.bouncycastle:bcutil-jdk15to18:1.85" // for jpeg2000 decode/encode - compileOnly 'com.gemalto.jp2:jp2-android:1.0.3' + compileOnly files('libs/jp2-android-1.0.3.aar') // Test dependencies testImplementation 'junit:junit:4.13.2' diff --git a/library/libs/jp2-android-1.0.3.aar b/library/libs/jp2-android-1.0.3.aar new file mode 100644 index 0000000000000000000000000000000000000000..6c0bebbc443655c7f4f4add2be46ab1902e93e70 GIT binary patch literal 668757 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%0DfOxGjS)O-lu3F8ffLn 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 AlL|Hk8p<75M&$EQ*j3-)&`>*>S& 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

  • 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 i!Mf9cgTxjcIJ1XGB+YoW&dFTg?;P@?q|s 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

    x`FrJ(z07l|J3l0E_%|#a0J?>|;oF>R zE4YA^Y2~rnns)ObihnVHcNS&&S6dy=p@u-U1f@iNkPv%$T`nDdj(egH^>_6jWP@f5 z*c^iK$vaxQ!sKVd)fL&W8OiDhEE>9G-_>2Rc-O8!-=;s`mfL4WRk#c8z1|h2d#}?* zyIVeB5@3*_Kw{A0`EGdrBQ@a9dKm@R7AW1r3C(Eh)ESZhW6tCQenqaR~Fk zki+iwPGIf*Z^{kwM2u{bfV3vcdj6=!IDmiyva-PRdP!dWx5R{Fd7YBr6T+f zuKpsMC+UKvK(Ln(s2y1G&ZE@Ed@ib~nE|SR0>;8BWnoSDPn&7~Id-Ivd|~)7Zwr7W z5@O5#Q+NtE=r8k}q{7%ZTamQqQE`Ait7#Y06-{L1iy*GG3X9>cFQ|}wleBVcFf6La zDZh?Lg48!yZ11hPeb`CV#^GP4ws^QQli#+og0>L20g|a|;S(nB30`6krwq1`YvBT3 z4#S78{ETq=W}-W+4hmzhHhI(Zo}$0i7i<}>b!>HZxTfBSdx`*h3pt!N_>-29nvnf{ zSlDkpA~0?M#R^AOjJPwZpm_`}2XuEjwMBOA3DV_egW0R7ZMNJPrQLG3gS8U%ukiX! zCSEY>RX%$=X+g8fL4#9UU5#xx?Sgx(vU<0^HMYnN!-Kg$XYw9l zl1J=n+Z1jbPhy=Im?@})k-kgWJDBX%kK40JC$KIRALeOJyTaObfzoid3CO>)whL&O zqu!9UP1wQ}5xt6+J?7dKUVASWq)0UY=#WUP&{zsk>VOx4TtbcwGKptrqeqYS$ACnf zi|X0{68&Z4k?7Ah#yHVWgs;JOQsPK1-fM^m2NRz_s=NeQ)?2B1sti}w?b>RmR%2~C z!0F&P`cc=rO>$E=uM|bDj$6RkZaS(JIb^>`rleIpW0p5OltL4Q-|Ypr+$uNS08JM> zh9L>LX;v!tf)UF{9Jk~D-%=>29u~0RTZ`l-CDp_Wkl~F-w$O`KxVIEuq~+aWujAUO z6)wH}68VKSYm5Ch;}^IEUy(=3J3S<1L~Z_U*okmhdxRKjBk|Kmh@Cd_CtC|JuGRFP z;|Ls9^JC;3)#!1R9@pq`l|LS&$Nk6AUG@EOBWv(Ofv>^ndD8sc@SriTJh)zZRG$?h zj6SPv{L+}!X5$w=D|$C^R+v@r(lkOi|1?6lm!?s2hkqJ>HiXeVKDR%h=-u?xNSE46 z)Scc<)=PTxXA0_R+QE|5 z%Yb7**2rn@OVB1P$sX4T*>_gmVo;2%LZdr|NwKt?MF zJxsiWXIT$cdn{N1e8p-eNEh-{gUK3CJ5fjzeG$vx@|sC5ZI)tq1l{`njCu)leaVtl zC}mYkSX9utbRMr&xJ^I=&Kv~ZL-YZ{B2cD83lqktxABt1xt7F{NFt2bCg~i@87OlZ zinNwPI^Y_oNvp7Xox{8Jtt%|pf4BmrB$W}4|3?a1*YSQlZd%ISjlc)XTi~1M5iOSs zBzv5&{vE(uv4)1eN;v_)@OAD;&!)17n9I8v-9&6aJwC)JoBWOgOXRu(Cb+0oB)B|k zqFp3*W6K!Z%TCcwOjjdHM~s;|>D-jVT;C)#jd>4Y+*w?ij*mwk)_qg>U%pq#UX>nj z?8*o9TPZ<_dxQEgXT|1%Uw@j=9oRl7GPGS@=A+ zL_Yfd68Uwwj>7ew@51-@;CnxO|Ho;0{nculRc#*fA$8>Chp-czvg|L4C8uy=5>aMb z!uJAmK0AWpkNnr!fIPpIb>WK`!EIrJ8U&;HuaUDO@gaSw{|!Tg%>XLCHXAX6ExtCg zzw8`}7hHJXrP048_RlU?+r;_ac0m10<*V>yH)(ZLzG@HKyZSBs5zprqYDq<;=@4N`ySl_%ow2rH8mAPskVpraUA^@IHT z$o5ae7bf_=#0#jQD&@VlGWIOFzE;=8Rx9CVP=O=AItxoT@cFJbwvQQn-f>*2rn2&v4NT!k~0!c%>Eg#vW|bOt=ly`a=8 zZ(4$q>n2H?X{U@Nt|wLD&AAq>&aTbm&X0H^3NU#<-L0-~;})blANJmipX;lY9QX?| zI{H<_kNvoFP;EoL4kj|~R4wM6AXyevSlJm_eFrJL%#H;rwRKc+GZ;40A#p1l>b=0* z7A=kOy=T{fB72=B%XVE>?R6xTmaexOmKW_CdFdKb3T#T|LBy!6mu4WV)A-3HR<%uu zUYCf!db``MBYwC2I^uWRt|LKf!zisKYx{K+K%uu?xiRf(J#cd*pS?@ub>cMmbtPDQR8HD#QhbdJix1#C^a zt5Fm}pnKCPilf2_RKJlkBh+N1nuXzIcaVaDq*aTgbSJOoY6dOL3{TAQ{W0>JA+Gg5 zHe{@0e2?V$>sdeazimBnYOkIhp^GaLo5qK{FPRpRkvwDBtK+H9=Te7&~7 z&b>f&z&b5zi#@m5X#ZMvHW)Rl?~GStf_gNjo;AP1SUDI8Q=J)q*x^X<-UE?8@o zw}ILDO_B6H6g8+2P${Gp_5?Q=)1u>s+P##!D1KHRiLqd2Nd`fZvgSF zIAH}v*zzOzQ~e_=o)QJ*=G$MOCppRf)4*o4YN;x5LjSM80;cE-*c;i8NodE^w+8~^ zljxBT6h4t0LIYB_JOO{IpP=5J#NM6+{K6B3Mc*5!f9CJy{i%4oTqRCPUyaElt6?5{ zHIV)j)}#2`M_Z5hTC~Hzjxko@@W?9seJE)aFABlP(Qx#tHy^%PPlgEilt!VZG@1zjbv;%2-r~wQdR!cTLd$ZKW+B)A;j|+ht zaWerPjEIMWfp)a2llbiJv+epY||FvgpNklIBrW1OhPh!bT2mt9qgv(xuebiI??Oh1Pb z=7d`YBz;Z;`kV%$R*G_z zcKM;^g1HX)p{&(;#5_QpMc#pUd_7L9YsgGl>*XZ$n`@WI!%KjfDU0F2C9fkUgNp$+f>55a92?_NiD$&*1-3*ybp z?-)~yJ~1+hDPvC}VZSJ*W*Ad=m_ds#VzP%ep81tLUZirF4RGMd;&@8NBLW%P=%SYr z>Ls&nJdqqr(*v8;vnX?$iQq=bL$+VuIT*N62u7y|sxK1)-=ZteG@)~lZF{O2-s?QW zJWmw~17)D#uI`{Mrl^A!Q*QR%f)V|*F0)pKuUl*y+2CiPY6+;3BbT{L)T%Hp<_w+? zS(TMkOiXW({U^z-of~{x6xwnRuv2)f)X4buvVPo|UXqWg-oxk?q!j7;ZFzJ)fU@p2 z+(fTEwe30Xb#Mh1#;6`#O$z!`K`>DAC_I!Mt-yN!R<#)!zKwM?yeWXuk|S>mNw2g1 z;5(EoEA;zg>@=P=B9|VPOV8lxV>WoqMH`Qx`#UJSyY3|v4=_GSjhVf_VHG@I&8mim z)mX~W&`G^ZZzpj7UV~s){`UEV$45OJb>ppjVjA* zo$Y%&TBx5lQ5AmnW<3iT-;OHOv-ICa&um}#nOjW!6pKLoNx5JPp_T8_gc@q`?xU}V zOKwJI*8l77`{Sdku6<|1Aq+Tj1{h(iQRjN6nAC^~M9c`+1|%V3AQPKR!UJuPkd71~ zhM9<#KwuKc;W#$_xRl%W-AA96%YF4-XzN9^R1%~~pccZ90#&QgT0CiJ8-6qiKbm># zyY@aa6A0G6AOF03J}a}od+&43UVH7m_V2Z0_MK=Lbhi$n2Pf(e*(tT3o4)+eX|YfD zI^}!!2C<6v5*P7Nnn(*u6ko&;a_F^oZ+2*;w~ERS-pXe^u|k!tRVmsYQNXFiG`9## zG4ph`c9vyz*(~3eBVV(&{NeV#j9(_1Sjq5O=4dLMr?3qj0bJ zSl=Vc{X#1DU*mGGU5=C{@tJX)I&z}SC;p*`wmPVr#HD{VN`JHM6pB&H?=XMovR@A&2#Ga%(seh0eZ8#c?8FItp#mYMr$!P}UQ|r>#+H?=mkW3)u|&5@E;HTk8z{POru345j=2gz~n= z&WpyOiRR5`^w7x))_G1okih%Ru&kK4*JK>+gC}+{I^OlQG~eZt~Ii!F&?l zb@Hcd{r|=MS)GsrB7aiM{8>FAc5|?qeg)ZfJM!sEY>XTX*Hp+hJM__PJoT|SCa&;B z2f=z~D|I8<#49 zRZj$hKBHE|)pM8mmMRpI;wv?tDH8`sLd!~V6|*0$s(-0PKJTWsvqWbr*$NFt!)K}@ zl)rCIK))ztKmS8Yh1N>%gV9w=RRvqe%Y`b{P8zo@!4NOJze>xyqV=>TQzD+68E&?F zou1HtqB*P$lo|(0Mf!2X-j;Rsl-`4ZG53T+vAzT4EV@BJ@Aae0#xv zy?nc`ba1|H^k0*2_445?9_m_qe!(SiXN(dtu~yVQ!rY%fVj7jI&<&WS zH%s}x650Q_rhI=3TiNC=i=Ah&i@h=O61amUR~6qXA&h+`qWA_qP9cyd{l?oRl94JF z#@-Ss&9tk&O2y`NVtg7KvP%wA4Z#xA}||nWWq*QNdh3$i=uxdgm#3 z<=Qx5@&#v#he+6G#qzDu8oP-0i+Hr8ShQy0Ih&es9B#>0pLRh_x?Px2k;nf?pS#8{q7`#(Py+*!4A2-l8i(dmeR;ysfLx zQx_^px6%Orv7zjd#X2b8{FdlU=aZ6HcacQ4R;}lDuGZdgK)0-!@HXFJe~{n5I-@^G z61L9?UBHzC_6ToyRd}nHvAh_aS)MEkK16*U+)SWEoDXT!oAg?Twz^57CZ2w9k+{-* zhi=cH#(K0qE8_~iA$kOfpqlB>3Nna8r)JOKV_xwiT|=k;N6(5WZWv`UP0(K`qTXGU z+Q)pf2DY|5KKn-*HYTCdwU;7w--$o>$mW`wEm$MT!u=|Ezk0% zJ4_y60x`VSW(htVUTe1mCrFb~3H_V3F3Z|WZL@_nyb(P9FG3d+c5}v4f1wH^1>+{9 z>FJb)Uaco|MlbYGwtZd4#z~w0kkW8q&9uzkz2M<0YsEYtVfP-Yy+wCsQ#a+TJ}aBE z`Y3Nyx6;Gizs39i( zeN@{Fv72L#qRmT*&U0%{kI`31oZl#J^iwpuCt6|`=V(WPiQg28%Lj&7ElcQMhgVV3 zT~wPg574msp@UjJ-)yA&I6binn9v_r;5k(La?2`8pV_!L3WmFu|5-ysA009C7cL)|7f;$u3g1ZykoxvdlcZZ;ZYjAgW3-0dj zKFr+7d2g+E-&=3p^XJ|lQ`5b7?dhuecJ=h?-u=~s>SGl9&9?Sp7S}gq?DUwYJ+eun zRT&gwl^(j>J$Hl08srA*(oIQZIh@m2dUw@T=Cn9Y1&dAV{TsT@7HiDwQR>L$6KCgH z66Ydr;?P7x?tGu|%vR^(J0h-Ho2ub&Yg_I46YU(t#@vA9KeFmeN}y(0Eb?A{_#&MFwu%Ca6bXI8>h+}DKdT5xw=z98nbLpnT)Rw0?}4_vn_mjTW1I~6l45?9 zVb1Fr0vjFZ9fNsDFER>Cx5ze4fiXflQz*n$-;=^E;RHu>>PO{+e#!T{fUZcM&`kKk zl^f9QeT5&_ac=YX9c?k9|9ArDdw?$&;f! z9kMS#Jej4bzb_+E%6Fl?T3YeT0c*AY%BL~O1)&!n_2Pr>^}e|tWkHk*I^Zr z6+V=_jdU^GeNJBWL$*$85vyM`42xHRU-lbBL6#bBV|7Q)v9(&y8BSauTBXl@2XT0h z;{G7i5+ws9Y1x{JCZ)%Yq@DYAxtu)ZYKD%|OyXun6PUI`KXVgO*<&KKSD~Mj^zeCP zO0JJlUXP5?4C3y}?!S$HtFBnY49-XQG{uyv7(hhmRH8dp4Q~1+#?|FNJG4!-41y-&z+EDSPvFFOW zt#E(ZYmL9VOq^qUvr&bn^ri+A<)HfZGwQxi&RD9fq>Kgm50| zjkf2N^phQ)Ir%qAU-=WG3t7G0NuLBIu~n&(N!+K_;gmQx0<);v#SX()&+Bvk+?Z^_ z&=c9Jbbu`gNUz@;>!-@>qVPw)z<7;#zxFQB^L|?G?xQ)n^M??uW34yyi#?!^o3t!r z8>1Ao2F4vdSAqgPJq6fLRe!`SX}`bE4UeuE2aLU1UfQRqA84VM5&bj*L>G|NQOThD8Ji9qp{ajS^o0b zMP?hR{?eNrQAzPk7;cR^A-pqm;RF0j8*wS1EL3N$%`56iRKODK4A3^uBcZK8Fti4<6&dj zJ1?L)jnzpwV!sxZ0NKoZ5bLB76F}G)R&0_*(>JS@ z`8++UqXWqdd$Ahdu`|cNDj3!Fzk^i_SYRXpO!tg|y+?wPAk_;busem!;tGOB>Vx1N ze-&TkS~E&J-qt~Hv>!(G;!1AE;xC@^b@g&dpDVoem`@wkVaTe2(eYg15qVp&>cJi6 z;2&A-?~<_S^XeE?iC{Hli++21TlJ>rLY44YrUp zN*N|pOW_b+vvABkAjC=L9uB|*#)+k&RzOESP$fRvDKWb-Uw$%Dv z6F>-|Fu46Sc4A8y2c5#Ie*j2>gk(U2tH-MJ13O_Hete(+UFf_nxz0zluCBA{-uXW4 zM=((6N9;j>ok8pG`R!NK8c1f~A4#&$bX>tlG&nQAvJj3fJR?!CZIcvIxEOvB zD7b@iNxIQI@D~`ZyQU^=>emG$xlc_@Nee~>zU*=0*N=9w5~{}bJppE^Uhs7-OB8y) zFuiiQWK2I#PekNCx01JLmoIzNU#fn$^!Y$iP#`q{^(L8Mu?U%YZnIr}GXhk-uX%2= zGnI?|6OjTEN8&Q@4du-B5um9vjO@X4$>#rE;fLd;GA;D|#o{pQ#GpLn$T=lW`No;7 znpu-a7>EqLeW2mw5q{FKWWuj>SZj=V0?3z1%BEg+rp}&rrk24|Xw*U~cS{d0#?^R% zfJtc*J`JVKIk15hJeC6~V-P*_z&q9JevGU9OCcg1sctFv*Tl}6)B|h=*WaPKVrUfT zN)31U^}jDl$7@KZCh`g`5R1l*P{3cSK@}DDZL}@u)pl@}p%sVJ9$t;Nn>vO~nc*c> zbAM!gW>1Q@9Y;jICv*h*?rvS0!&$wOvj#;1ftfbgoJ+JFpNabY!X^t9ZA~dFofP<) zH@+Xl0iH>bb^dG;snyas z!y`Tg(!0n2|Pxd?6yBR!3f~MckGIKRgz?Dkk{E)A_Pw}U|B*NUX*a89sNNsu6NLUvwr%5E$`q!kY2PD`#R(8<9x#U3BM6Xg_#*vtq9J^2t zW@3(DKEKK%19G$WTkrH_gMvMUg_|>NU&YbMoPn7li>J3t0NER+8Sf?A+Wx*pbZFnf zjIp3SNp0io%el4}d3WO3+|9<_jvWqRAuJ`iL~qoiEue61mWQWF!GLsnwK=_Z6uRzO0E@sQpDiIkv#fK zXHlUt_dRO{NO^Gwi?cpJAo_tsI7L|QjOJ1!(`1Wbu<^DqMO?b}$o0(Vd@^a6NVr<2 ztZMayM&ny0Rw`}fR^q6vVTzTPEybbCw=;yzR>Q=!zh+y1GG z@r79ZKxMCpC90Y`SO;5~4Rz7;h&p*zRfdBt7m^VqR|Y=ROJr2XzvrGTy8&V0rHgzh zpjDN34^J228Q&&-T04l7(e*mVJYIwYO*REG3yi{J(G_k>Ny`@qZ}*_nW=JgEOoB9K zbdDZ0#5$=Sw4Pr%r&yiH`m?z9OYek3S#vS*Snxa0)XL$|wY>5*^6@FRvXM)fSu1|*W2EO}fX zDk$B)Z~VbsX|lGA|GLWaN8Z+u73nMA-17>KzP8hm$C1GH2m^X0T|;QcFyn7@S)|Uj zp|f7I64;XVvNo;#ua*Moxkv%-@~*GQKaN1-RuYMFZ6oL;DRWXJUl{!sDQAeTv@Uq> z#Nn~F>@xICO%K`wLBuTk@{5CKB%eV3!P`Wl`ZnvTTXdC!f2JLtG2b?}{+g8*B{N&1 z#VsLWmHQEpO0rtik|F1Jxx2Ki)dX?&kR^WRSrsQ0Odd1ic!5O~>We zsns#tbG)cl3}q(~!<=k>1Z#Pte+Et>DvEpw3T$nu?Xh=$-6@G{cdOO$;IX%fxK@$& zz1OtH%h6qC(lIDTy)+4=T6&StT9X8pk8RCUehuwuwfxwwu2oss5nyfho}VTM^gF2r zjk6y9?U?kEQ2i<1?XsCCydcER6ZOW3pRwG_MIH{I&b5;3c{ge`$S7%XUfxskIPnnB_WviuvX zf85`Eydg9nVIPzw=~+~J3_m)7^PCg2%O=Izdt=M3gpdPjX9T&;&>&m@W|A70)Me*& z+>{6sxXnMjz7}RoE34$B{upUJ)vK>dY4e<$Mb}zW*&gu~y(KLh@kDcrK90ja>f4W;Hksu(80s!9}mnL(P{L$@%@h z_Cg}c<`4%9*5s++fPi~Glh{bKp3-sQ9utS|KAqTT=EZ`%W63REu&1rQxaO8t9(2~< zUEU9%%dLN$Y(=cc1$BZhQ^dD#*Qto%ALmtl<27`M(gNzWS8Oyh(Ezp2%Cj0)jOkWc zmyCuNFP)?7)U5U_UK@=W?PQ@IMb&OM&Zj;_M&!n``FE^d80Npn!Qe(gC3Ta9D?OeFd9V; z=QP^P=Tbv%hu4K%_rJLtsQVTZd6C*K(~Dah6HVM&P}zUJ>FR{y90VEIO(EMpe-}b) z)`#)BFPRMbiHkbvR~oOVjwAbh<1b#Jm{YnScir#a;<I`{>nZA{p@5@}vSa98#0O~MGKTD+R=;B16enSN`TrLx&)Sds>HR=suQrZ1NC%-WY z2$M+B_V(Q=r!#^xcx*bVUAc9Hs6L+>k?E9dEK=(CXn4b?NSbYB$*YzvV7*#9!1WVJ z#cw=LB`zxA*|_i6o4*cb3)Cqko|}s9orAs%IybgbVKOgr(LP?9(1Eaa4&?NiHr z+hd+{300u1dMaJcYEB>R07*i@NXzxp!MOe20rYuw^B{x>Wa3+W;HUHRKy(t#S7_<+ zV!;Pu<@K<^(A3hF)LqP?VW{=jke`Yt4P^ykM2gu`cL>)EO>0Pot&-WqV6?3z7RNL# z=nn_Gx>@|6+%ZK$F<~zr(qy`Fn#fNWW=~?Nz16Cntkk6Tzj&zhN}an3A~n0vdFL7q ziC~W)5}mL8@Stv+et&DnA}^9tmIZB0p=|BANUthjJ-3mV$Eb>?1I;M~#({pMC;8vs z%0p~-FAIKH!L7eXkxVF3V_221QFvTpEYk+`jx?TUpB<)AJ8vHM_}!9fHTj7~S8SxY zo|F>aE(=~wuh(xx26|5S(|{xm=LT2wGYLG9AH>A)AdZ^T z96aVtyq5ZxMZ2Hc(D0_aUdbH@>IOk*c*>)neApwMzM|@`SD!+RN1w4?_gjyhsqM`I z3pXdKHfXc(Q9GNo6Xz*u?MO0Ftss&bE^t@!Cd0m$s23~oynyPxpkVxU)SbTBg+=v!%a)FU9oP9&xHnSG7L1ufRn$r&DVJ(2Wv~|DP2*I|T#e+}5Y%c6e8qPyV^L}H2ge#aZ;}G{TUQlV zYo5-Ry;9vYd1v(y>BzK&YD?@hh&>e7<^(W5@@fkK9ScoD$wyF@F>DC?flSnol}oAa zBa67s0f8Z|N>{u3zL?goU$+zPjCZ|%UvSjE55quJV`9c9hJ0_A_^Mh%>^^?H)%s*B zB4j99enGHFxy=0PG4|)`=L|&T@k|ixe?_=AaZ`CiGxl04`I#dUqUn&;wAs+@t6f>@ zg9j|}Y}F@hlCX)c(Au?R>v z>kY+?vvMn|3rOx8O3?4od#MWxY_j}rn7|?@ghA*ltE&P|L%og*9?-p1fz@eIV7qD< zZNi;MYoi|7l}nZ@S%qK$x`2^M7|S6wnopt88H}2GR)4eR6xX(pX+jDMh);7AL%WDT zkSes~)wEyk%7lxEk{!A{%0ITCcuqDGPy4JNsLf(^yGc2MN7yM4d7HfGxX%_yS<3?) zOu3`=){5yE$nuz70p4^kJNX>9a6LI<>Kp+22DW(uL-~y~l#I>KXqe$bgZWMT?x~}x zvPARMfP#_)$tVE=w@&uyU)x#8jtH1e|UxHbR?mO70 zttz~EE;cUX1Jv|ZuRn@IO%l=l>W=EE*qxgEhS!k~f4-X*IKF{08!Oq0wV_Doeh#u( zUa5?UI!m?xbPt&8=}na^DQi%kdTv3Xu)iQ3jbht(oMN{0VXzNvgV;WL>VV`I&?;Vb zWjI>YiH0Ie(M%ip3bQ~T8tK+$a{!((7Ct=Bbo-MvX>|*o0e@51DRXM8Ha!%{nmLB? zP@74^I({;9(J;VcA+&`jS}$n3Bx}YQUTClTX5lMzo2rC;Y}hNfEYaC_rbWOLTc2=4 z>;LQ>)@>Q~QQwtxZWm9fa*{=)a*LbVe?wcx{UXTQ;z4?=UCMkK_S(E{+dDGn$jg%= zL^(soWaJe4gZcX?0sI5YF}i0y zekAz?;z#K3ybGT-`xtD$;qvloloiEC>-42bSvU5|O9f2sU3UI@UeI>_OKq_J$#j+= z*7|`5j|(v{hfG$>Dr%l5j}y3KtdeQv!CVi)L>7|{hv3RYCCj-w3ywr3n=hErdRDM+ zM;tfP9Y=qmqGz-IrIs#CxSFIeSm5DmViPNK7sGnHzbmpnlyzgdpBhWGs5bY5?mbXUPeewNbI9p>)?Qdc} zz--}^rQ33j%(-S}UF=DWdBj`xa^VAEAz**1b5J(tKBeU$r&V;0p!p}EZ4sd@8E$%- zK&!pt+RN3MQ+Fa29}|n(q%$@C#goez=Ruh9L1m{~=V9mUw%y2&<58jn2M(D-s2T4G z`*_A(_j;^-(~n+>?+=%3ddY*tXap#BgD$gIaktsT#nsRgzV zR)P;UKUIF;zul0*%#3!Hj%OOdmK;NG-K}Ha$mJR65A_y55At)d`F!4MqPPL z))HH0=lpys?(#;bzirgKeBlMc-iVw$vHnHV^9y94ad3p&D0Jl$YBUZmo&zgq)?;Y| z(>B$89_BoVoiw}>U~ayXdA{hA#^sZLpFxAOXHzj~qQ@dVCwhecer7=vF~p`|ptiC4 zzQD#-ov5maOoL(4)t25-8L_f{eWxiw=WBY)32nL%9g}CDLV3*wEhf4$MhD(p5MdaF zWu580t=ZryutEx;&sR(VAGkk$dRAcqN0;~HDW48_7ODOF(VLZBMB+zNs_>6ln(UU; z-f||~qFSS!X&s}|<%zf`C9JV9<`mYi>mRXk8)L}>RG-%JD%}i@TG-D6!Gb}0y8FMT zoJsM_ZA$gyD;CT`Wz}s9VlMmb$t#$2vOC7h;>R1L+7au~ z)|^3C)xE^O9Cwxb=FlY58=P%Mpt^XbHBlYgg%gNKlUi2b@ET>^!tP&9(vkBNHrQq2 zTn7+d>4Vgtt|Dcm)_w5xrY(Qk42 zeOQGfwRK79o)Pp=x7O%_Z$k4cbN9!4u>`Z_j+172D4!6dH3i+;8LP&HhZFZoEV7GR zB(Yw89jLCDyEp*2Zx$cfY6Yu)5PE?|oDNGJm z$aJI%XMpZ+>m7j|Cux{ORJ5`R5bgKK^aSC<=Gq-;BT>>^|H{h`rEz;3h_X$1x-H{Y z0et0>oSQV^M!Dec}=49y5OE zC9Iy*6!PJ*Q-CRQ5(ttk4NScTpqNbV_4(p6qlVonT4$b2zMbmCCBx zwA&(C@((mBhNkVrPt(2M<&y82RA18kX%Bj@>{7BeD6`?NCdHBq{k`1U7-WR9-X1-m z%^khWL;o1#AdZqJE?nJW`%?IHbdHMgij8W-=G6|@{qn=`-52SqtD(a-;Wp>_PzKtv z=ZAH+gBRA~PtK5;!3e@N8rP<(9ZVLsQJa8>?;<{xGQ}4a-%)gaM5TX5%kG%Lcdb>^ zWydSK&=T6=$1=iM+K+M5EYa`B=H<{Yy3N|dfO~Zcp>9wQ(MUG(VxDzX%m4^a=CtO}BrTZj($n#_);atVd*;Q@pptuuPAfq z(^;SvX|N3qTX817Ki!=tZmrE{5qT9>*n2YFs{4TguLI-U{X~eX3yeiN$!IL$jfr7Q zA~G0hqk*{o^=k_mpuA-%Y{2zU^QhhwT*txQo;K>sG5Mq!{JCMiZZW$=r=D8GHp+6Y! z?yOn@P~JNFX(4<1+yBGeCs9<%yJo>z5w^;+@GZDCoV*Ei`s@P7ZIvqd z@?3|DpMB0RtDr;-zIWj?MlMrW3q|EPo?NM0op30=x&I3|rcT8E=)|-hufkxv{?-*v zooU6%%iRju*(7}*X!VM1&vIqWJMW=kTco~HYiT!G4fwp9ukU1KlAh(YuSxS{**sXE zWsLA{=zwF8(Bl_r;q9&E?Tk#=k&ctM_Hb&^;9-3c?RNEK+bd^dyyOthaD=i$qiA6$ zra$N$1Jj%ob%7A~4)kD2(q~u(tho?na*;vLL;}^_`sB~~W-r`-NAk%I63SHek|{eQ zPF~@y*j2%l7%(<4XLn>wmDks({z1U?@T&p66(ADK)fghPu6hxdM#OWV&D%?eW)ZUU z*C1 z^KHF)yl7V=!CcAK(6N@U@oeXjz+VDG(A?ygl6l8dh26>&{L5^C)6YsF6Bg8h+UfJl zjk_x0fb#rR_D6$GY8%Xw5Aal$5Z|E)8i*FZYHSjo~}<~&3MbW z?8eC|0f#^IrouQf`;A@lVX4u_vN(U@O{alS!Y(nVlo(d|I(P>;4-GV90YX~13B$;n z5`QN{ZsRukH^Gk$MTZQvKg)hHMP40u(Hs8JmN1}${S<^?N5x-aAH;gk1fTZXZ{X3z z5anjlo%~WA))tSsI00rKX!A3qxtYY5MmaTu5U{}6!6apgKX4!9_^B!2$viS2QJxhV zsR8H4294~N=`w^6EWkZ{g>7qRgPsN%)P_+Cc*5Gpa0~!$rC#?5@7mI zqW(wa<3E+v-fMFRfq~(_=9mABXJGV$`7K896&4B}0nEc65CYLUf8Tv5+gGkc1V-si zSSLx{DxB%#2T({ zh~qFxT>3$CKve<^i(G=m zaTsK0^!{crop7t{Ojx7!`8$$-1J}Cf_CZ%xoANN|Nd5&tck*8VxNE?v&7;E-^|kgzac74`v*}IepA?!`Nuh|#U3!b z{)e_C*p3?Zza*-7vpx)F54J-7e{x7v4SpHsnD8bV3@KHOO>9`+aXP>f-I%i=0w@f9>xRS^Lwci#Kx0<^9M{c6AIk{Y#9s75_|_ zg&cDJYcSVMyT}gZ;`dmO)|)AYYZP1fODsKA zTh`{JlPhK2CPt`aF`BEh^hjZz$4 z=%koepIhoDUDLGIQNWKl^!mN3Mj*`u>3fB?wj_Oh3&o|_)7NLc z1|!Fb%OA=85oM%qG4J(t=Y%`eBC>Sb5>zes;=}s|xzTDhU$?!Y@Pc(3KD{+2{b2W~ zRV(%gbSi>~8wOr{$v{2D+&T+oVeL`a@(I+D2y+OiB4_P+L3+S~glti)O4#Xic71Te z0KSc|sm|BWe~^v5wCT}#4jG&VLGe;aQz12-L$|mQmv0;@yFM5MJ$5-U80HaVu{?42 z)>1>w+#7Z`K2FBMm^%}HKhdqIPoON z=&pPc%zrnaUz@KTjhnB?>#Cfcw{b89tnC{t8mo^3=q9h6&*HDI{(m}OUvnX8cPkQi z9$q4^K#T!y2a(t(npNg%E$CGgE1Lia2GNZI{)R=B)W0KljRBgkqC!mEDVtUPMJdYO zTPxU}#;v38KON~N?)=SgnC#Hq0dA9fosWksu$UjRP^7lwt`uy6qqf*q#ql?)z63VP z+64deLxK7u+le1nv#_h1789@7rFE-T;HwyfG_KR@$c^K*L$b3`E6_A`bm|Z}(D7=t zR#WjiKb>L5$4;>=&=gBW@=*rO@+_&H;8@BNVxhe z_u|#`bIW!>y7!A`eVA1!*C*RA z%Mx`F#Yu@vWt%L$G>M=7v^U2N1CW7DoH%lQ*|5YP4izZEqBZ)R< zNI_Lv6?RQ%!9K;6t0z`2MiVNJb%#mqCpL*CN0la%D7i~hN>xg}{H-q4f@q34S3MU? ztSHPgES~@9zd1YjU!BGJUplLL*>`QvT+*?jr}%X=GnJRlc)I<3){7Kfu=>yT6;8L; zF9mh~{V^?wLC5_c{+EuCF}lX~|6^6p^nYvexJ6aFxjV3Zc z;C}lOj%D%^x{!M(zw3QlJcrvn)kVJA`7lB1gPDnZ*0y|kslIZ%$x^&HLrT6DBYU!j zYNdN_PbMGdONZCRomo*US*5N{aL!0qGmi6ojNd)UB*in!6)`Of5R%P zz1N4;TB$apX>RpDj{`N-3>tx@cr2-P?lAJ9_ZojR8+fV?!}cB+b<}Tm*VN`1l9{!L z!Ti6gzL$C%Jz*IbsOq&J5{%|=#;XaV_yj?wRzSKn8N{O+?^C|BVO@&BzbHjYtBno` z>mm>CFlcChQ4^^3HmzD_vy|RENt%QGRb1bFgU_*NM3;+?^vN{r&)uZ(t?&$T&&ndi zmTo&pr3o@OoErHCj$-5eVEDB5Dh4lUaJ!2Y!IYqmaCp-#9y8;mvB|z|Y|vJo{RPXJ zVijTpk5ETVzG}nZ_NA})JKs>kCk5aRqo#Pf@PKG5>ajz3!y^4o4#|dvv;~Z`@!2lk z0y=*2i?lJcfyl0IBbzwF-9Wj=t(tFzVJ8Rh#)=HX4@6*JCVor)3H=pbajv-g>YFAL z*_WN1&bK0dy(K1^R`QN$+r@gI`=Pylj(fP1Z5uk)wj;9VwhsgQ>ti}oC$w?9IiJ7xW43#vCgLDm zyLDI!Ie5(p*t9o8zW&hpMo|{-J@T73A3nT!^F|oook19LCx{l%AyEhI72yY1f->Np2M)nS-c2*9i=FHCar|n4II{kBqeDS7(j+m4m zB9K+76U^|BktgE-|hAcl|y?0dqlY zO-o{OV$JVFYDF12I*z)!-^t2wOl{6)6H*8IvcR6}^@o>sh2cjFh}-#UD!cha20Oc( zi}2HQ5HMZtP$BI%&DZ&b(y!cGf+uX-maDl^k-?pkp}p|AXvq^Yh_+^F(mWC~;>QYd z(!pWK=Gz?~eP2JaN0BgpSKTl#df`hhbs-@duL~JjFs3^gam#g$es$Mhs1Cc{8WepX zAV993E?DXjBXQXva4`5a^8$5Lq^&7yN&+IY*Xx|0PB z%jEgk5rTr!DRzVfO3({()^$eixP8^^5QQJ9{uGg1iCekaez2a$X3$o8K9V_80eNaK zS|S5`oI5-i`=CkxGB4^Plk@L1mW`eqk&3RA^}isZ?(3Gm?2MAhg3Mq)9*$w($@r6H zy#w&U3-Q9QC%xMchAcK>zA1_oky)uTc7L+&rr2IP*-uVIGA+J}%SCYz`3WZ%D zd4Iq7cYyuN-A6&XOFiDRSxGp)eyV6WFR%MH{+ zGCit#qAuvb?|aN6HJVPif(|fz4|9+&9>aRbXiPm1ejvNqspL)I%XD%{ZuzLF_3Y($ zX^@s&X6Xh^=H2>{$?gGWbSI=kXaywp{*ZeUBo&<;AcKU$FMDy;{hH|&kW5v@pBBLC zTaqe5F_;@I6^ii0l8>SUsuOfFKNP6is1lC7QhPQ&_Y0CoWW5Lm`Q?XG%MX27Rj#Cy zr=R3h_3arg?jV(I72r>M^a~k*Quk0AV+&P@&Xt8<8Ys3tRH{9#%7Fc(Qp`ho{3Ld! z-1V}Eupw{uZmhSRp=4?hPhtpXz1PJ9j_;?f9g@UJQ~JFaq)z{l4d)KeO+wFeGIR=v zpN?Q-)U<)5_hGx%7CRC^^x@;)Y~@KkF(hm{0n=r<*ypI35Bg?{ z#1N{)R~YM$HGm z%-x&|&Y%rh0zsL(v(_obkcWg-PcB;ULgKpU(}Qm5&%3}4x$BLE@{uQ5tHCMN4Z_k3 zY#G3XVL4!YXM*L9$F)_9>^vLX>ZuBu5AOF?JcZEeVHZE`Q3BnDJLdCxEHW64V~xLp;3l<14Pcd;() z88a}0RZJonL$}H0X~%oFL0SXX8T*K?kYzJqj#-oT)UsB%z={D3t2FkZYE@%SU#S)TO0pRkVNo?!j zMd9fnT@-phca}|WNIX)VNyffwN`3^}5)OJ*sy+JA`Opj}HTBwT+$+7bFzqbp)5kO^ zlKXw}ep_$6LA`(f{BwC!^!g}2ve1$jocyjM`xbQ+fi*duhFck8_d_W z^Oz8<9>g|!Q0rlHYbX?stjv4pJGNd+r{6{fRF^)cT5>BUE}J;->^uGB$+AARSL;R0 zzN2|=L*=^0W9NrSN};AObkFsj?`xIA>t0#cP@MXdGSR(^JQ%}ZS{XJ3dkgy61E{Y6 zWZe28h<-!2WIX$WnbLzxUh#}GZ8~Nem}06wB5Vq*9C=!N7pP%s=_R^_ zsM6{!?+uJwYs#E9S8mtEebp)(bgLA3@?9dpEF(uuUiN~T;z=>U?harB- zC;k@j#ha$y7&QvTlUOVJ?i<R(l}Da@pP|_>|AnF7kM8!K{I1O}jGwM^o%| zC+PU3Va)i??9L->a=!)+EM>W2=N?otf8mW$@|(T40wfjfqb5N_dm1tQB5_K=+;JJ5 zl6S~)9ckZ>D*xU@Rl?BugT;N~2(0WO%K_TVKz5o-!B{07m4_Z5YZyxF{L0Tl7RGMa z8x`BFr2gV!`ZCwchVH7cEVRo*Rg2`Kq39DhX1oM{cSeJd{lZ2(;_h{3 zu>E=x*A+bNH|cA<=zLo4`5A9$8sj^TtHv|}OTgzk<42;}0BF>J9wMxMq z(bE)Gu>j49hX&i9^TJ!Mvm(vYgmx-)xMYv1o8mPuedWiQ*>k@lC*Zgui4ppm1O42B z^!@Qs;-q){&D)xg(GQ(JpYtM4Gf)EoB4>+!xt^N|fd+*K8+NLXF7%UM${(27U#xxO z$sCK8HoQY0XQsq=Shhg%tDZwpK8c%<-JFPBtxEd_MPB}5!0`d;pEJ}5Jx}`KW?`p_ zvxJ>uAJKfoI>Fk^$9dB!^s-`o=3~6t4}LKNz9KGIJv?$v#2(D>x_J+Vc*`&bcN599Es_yB>I3ZpTl2X&~>+%cbRs z{3n9)hv=#Muj5{f6ktq2fTA>nkh2TRQ*TqEHY2j|KI&DTI>Rlo$DqL5DEVp+tGu#! zt=`8qLm#hdQBQsxsz?6{Pxa0GyR*Qe!QELF54!jQ3%vc_`~UvUshR1izICh4nVIgon^)hxCkrou zRR@gh54$$v#%`kbx}gWh?l^jqe?P#(I*jjF;k4}e{m(?t#X;G}=PfUfcY!ZGErH;$ z08@1SsmKd7rdVolo7>7dsx`C8{i#3xX_fXQiBj3KY7NQz zMoX9>=f~73kzi|@2p)lQtN5HpnW(nG;VYTi@s-%$b-t#P5z=m2zxdH#HYUHx2xS){ zU%9^z+2Be|+4&;+@oIbKHVXS)CqW*LU~=rnk8sLTaaZ+Bki3maw9{}XD51P{Eqo1k zf_c<6h|CbVr^Si*2N}+fwj7VvA4zs)-X60S?@<}*#gBsDhw#mlE-AkD z91rqrhe&*8Bj^c=try)2$gup#vAwq}S5m6AJZrk3+x@Xs>*PzE@W}{e)&z$FSI$J; zIRI_-^p+g$4DGMmkcSWlK#W1iETwScZF87(s>2=WLF~Bop^o`2c_O_|M(nqGkk+(j z1b3JyW8)MD$Iz^mo5-m=0OBS=PnlFFApmLmJwWCB<5t#eShlRiTuymk)^q<*Rs*Z^ zLr+Zc@I80y1R2O(*(wvK4XuS9dra7jQ}He)lhC!po_lNl%?e-r_}7nD@zFBAgF5eQ zTl;o~5gJsKRI8_lzS+_ZL09`ifbY{+sbz=`(gl9Qu z;M;u}rXW?^A7?ykpDb6dfG2ID2A6rW6*#4aZa%l|jT`lkmR*g93yilMjm91~^#@>& z9hmFO^vycXQtcPc&5KjOl4IM$-Emd`7dYM3GG$qp>uN@@Wj*jIq7|`xC9cS#{N=AM z!L!@TTHH`g`}OoCUd>3B&++4__tf)A&6WyQqB7f5VU;D+mNO~jMn ziI3%ek*g8#gmH-zzI9k>_0%f9q}Jd%5k{W|d>K~3EkCj`PLepQkTD~QbM%5&d*jIp zDsl8UJC0gU;u(uP_S-(Eyxh?Py%vPpotuR^9v@X&#M*hizUtl$?g71;&7AHl3fJ&X z4chlkmYxWdfsjC4f4KK!;#z8);q=9Ls?*c$l4aGC#=))UnOLReYUbq_&|mG}KuIib zfM`I(Rn#R~$+yh*g9tRqm*e2$(pp_=X8%rSCzB;=#`CtLZZpZwMwe5@koT-qFN@id zcPbKxo}A~{l#d%BcVg!o*LD|4HyYHDhThvzcX>^BvB96u$1_#IuEGBQI`7`sU$o)1 zOm!cD&jUTD7TfjDx@uogAJ2z5eCWiEA|H7++iwPr&!4@9i;q2*YW<&5F0&+IT%OSW z)!7lz*6)OZQ}uyuXE)vVk^%R*Re~!1@WaU|hVg%^b4`$CY9PPwxTFXFrq0Fw`z*Uy zGKv7T4)}l>-sAnnPOYn^nA6q!Jqqgge!UkVc!DUXo0S2kCOap?)b@WjF4RBYXJ}Yz zi$OcV{=PQXH3U~@k1Ja;b36=rU;>wY)&1`km*zoLOj?;etlPv;UazoMEX$rT94z z?eu;jngA?RT?yYR?K$_k9hUTezR#Khvif^~Zez2-lKMpY_c@IQzT)Ry`#3%4{vY>+ z+eBJcT9>Z=ko z@ag1v3>!{aQQm&_olF33+(YB2GIP}$_V0GamL6L2u993`C8vbU7l&ldSDxoNhobNI zPG2T7+Mq$MV_>*WwpO08w;8k}kjsLS$6T>7vhFyUTBzdh*feC&;^^rdg+~DWu;2@-QEz*BX^x^=Z~w-x*6Po ztOE_)=L;W=bPOc}NAqgW1fKn;6BqddC7&Rb#u6{BFRqWhS#n_pybsk;=aagyzqy4n z9G!dXSBsqs|a8Kb5RLEdSX2FJnAHZN=d#f8p*EpDYvAxSe z-z}@nXOzWi_+$*pd$$1!{@TFB>nz~Y6-Z(jZdl6hwRNa=!@Do0bHA)%UAx&1X<)eV*VDn9g)`;y0V|5F$e8-n1Fm z6n99PHM^JeHE!qNv+RxDB$=!t6OgSikQPoBK}nbPKmeVVvj*>${}7gT{1+yPV3662pn{IQ9KcS zFckVsfp25*81)4%r?rw)amdvA_|Zl&8^zj5fiooNoSi*WDJ{U#uSZ@lO8QSU1d;MAma4|1I0?_P9C z`w|U;&9n@@y!B5x#jLl^UlX-q);-Ax1b!X!!SseGDIPG6kR$+QVNR7Wo4oOa zqyfnyjjc&SSWv*VM69{*@2K#?B~Q1+W4J3k&FglXZkah1#{G5naH@cIH?C(;PFNJw&;6~c2%bqBuQzb~s@{Wu!1DIJzvQ}T$x`FA zB%I#=CF0A;+@}|};xAQ5kOPLo1#D4)(Z=KOBmR*<86Bj8^zB2@BI+nb0+`X*T<8ut z(wXn9tzaBhbDm7#bYM?-&r1^112FCrw80HXAL%;MmiKI5uowjHeLl_V(GROdy5*$Nx~1*Cu7)FiOv5cNRo{EAAO zB+d>8?QrGh2k>F`#NGz;A-^f1Y^k+@4ok~F#W=Xi3C(u8HF)|FNSr^Eu(qZ zdVljDO7aD56#l&BwaqwrtA0>>*CHSn){gHOh~;3PAmm_87Q-mZ81UgkJ2HJ}+Aq|= z?+Sk;*@QJVc5CAm5ap2d~faQjRp+VjYHSfjgXn~7~h$C zygr(peQV!jq@9?^rtdze$1UwX(Uza)A|)7=fWhmIorfPUEW1ujxnVv+;K9~7{OG|R8@!YATqd|hsh0m!Pp zkS+W&LJ<6=|$+I z{xr9c!5W!$M0aPkI1QjESu#oi%ryDRpX}zZo@TrpH7bf{*3_4F@uJuhQdLP6{_trt zQC{C4>w%_o-X#2NZmr>XO|Q6Rd+7`M%1P&C+1~%yvWKtLBk>mC2$J}I3tvShpUGtB zE<~2;-M4fM0d~Aw-qDu({)#7j`e;!#hlAem8(|g_2Vev@(~A&kC-D<$Wtntg5W^g8 zX7`L!KF;osC`rm7;>w!gdY1x9E>J#_(?IA*YPih@vK#r3*J>(CTGTc%53=3(^d?b2 zi>T%AZMu>jt7ym#wO6goZOy`jFFeWb7ZtJPQuTSvRQ=ytR13Gsc{-WkY7)EPwd8jV z5>ee=Ei#x$@q36Jf%h+^1H!in%&Bpk_`Zkr2KO=!iK6@qBu&%TWGI7{i^}TB6qx7~ zgBl)!M@*TuaA-Iam-^~bu`;AvBH1_@>bA@5*|gIo6l5)`$x`EAMe{x-hXX7Qu3P0m zn@1+-q7I?OWfXdJ$VthcZE&C6Mll$koxin2?**&BZNN18l8jud$Y)9S&w@#*uAHA` zZ}~V1bt0oOm3w1_ywDd!oJ?vamF17&{KX*B2Q*V4_OVEzk(MyOW^#}D#2!FJpd~2h z@2+6`Wq;teW`6{3l$xy!E8EO8X=%c6a!F9Vf&^WmlBd7sm`pxOhr7GIt-m-Xn#ym6 zcILz;zEvk`mx2|F%@ghS<9e(Cqk0skIlp=Bwjkcz=?608%CEMO=tGg&42$>Un`kx=O zCyes+0@B-b&)6J(0N8!bBsB-*%Q%GV1K1|jyBQsw6^xb6L8q@4QlRbXk9g?%Rsnjk7xK*rW1sdZa}EsbV2a zjBeZU6TNBQ{OPOgY6aZZ*ICf|o1PLH*yBy#+n>LDteKaJ&In$eZN^!SU}s-9=PNmJsqHDKIr% zyW(#4c#nLL~N#A%+K`})taw#K@Gvyw*A>7VW+J8Og2hD zk1L9ANc8f$ohIK|cD=BBkk<5{3Nhy8!!um6o|HE2>8==%Wm_kV)0mLv5kaQKJlJDGz(j6*)iSX#W8&Uckoq>zJZs7dAk<)fzkNi+t{B3l%zoi; zQAqxpIS3bLY34|Go7vzKrYir(SH)aMsU|8bFZ#rVvu>Z9i`GT&Np9`jvh z=M{R1W?iR??0z%ibs4Wtl=F{WbHR9TH|_f#Z<+kkP|gE&A)VEG-kK0!_O^O$$Ya%> zpAsZQOQNd=I-X)Fb_?itW%C-&Bh0n!v)xqlO5hiV5D|-A*YsDiwYgGXfP^! z{_i=_EM05CzIsGGV}H>i@ARNjk$1(tcO@fMdCg)eZbp$P=d=djGcOF@w{AT$<(lOxr}NpztC3dTSBWC-tcpsy8-&HC1uH-Gl=E|qy@p_~_bjR#Y>aoB~S zfaNZfv5aK@b+UVbeTdHMx1N%Fmi}5P0M~-?)E~Nu4c<~eXf!STLYXSK4q0?Lg4sm% z6t>L;`-bNMP-^qNYET^iT+0y~j75mbJyT)T?EPVpdyXOQ3fV3oydP%s5*%F9*achn z`7&=>^gS~B$Dx1~FARzO;%CoWw)7?+5%97%ccLu0^h^aGs6R+yIjH*756zx4bO4wFed~sv@r#l%-RmhOHbuJRK)?yi?+?ux{|Y*{iRPk zn-|ew)FMNz_HV>Bhq{P!{D`}Mm__;^h{YaOPk3`wx21l?a2OaVTA6q?QMW}zI907M+4>R7NXFSy)1}9o z&5L5NvLf-SdM4OYRqT68wj(#zrqac2#jf9R(^fa(xk6tn6;@B$b|+%URut-dFJsJ} z8-3`v*}O-DWjfgQiEWYoAZreBkln~340d5}`+WT3K6=03vK6EEQmZ)G`oHi@bnNU=XpmmYTnK&!al`dST%#T?K|w)FE*;?{zgVJ%a^qNBN#U-|^= zHwziv{rp{e_H>*C2V-s!LpN+`5_0P0WjiABLe_ceVb`y+e(RLb(EwqxN3eOj9&y#; zf3fM}MFDrPd#yjK^tBpcQMJBkKlpBTQF%V&FU>IVIJSu>% z&O;s)uKQq!eQpAqBJGLVyCMZWl0MTR271N@A$E8Gf540Yz+tF->Xfm!x6VTx+2+{n z)g6fpn?JcPwTqx)-YE1fXqdMvVb7Hi#H;&YMt1h&A0u~H6a--m+tV0#A^~k+J6d^> zf$r+zB;1IEEpp)Pmefk>)pbc2g;pc*fb#$jxZunH3T$ck4gdNB2Ck|R8%N>H^0wl+w z$^h^Plmj42x;X)j!9M>1`x=ecN%}0J2p)sFZ30Q3Unzozq32wFoFHm*FG&z9X-^y^ zto{I(3yz%{5D&4(CNa_qK(*o#3xOyD0{=oO0g?kwArN?Wm;oT|@_7>4j?HNb(`5@3 z1mSI8PB}e0bcaD~NsR`bp3mHHK=+TZ80-Tdp#kU>>E;kL1K}SW1<=Y1_r*Tnf}49W zg6_`~+_}Y)AP8{Gz3@P_<}eNba1d$)K!m~paCL?8fS9Twc+4rFL|PK`GCq55=7o_K zh&aQI+AiiQXPni0Zso)P0$a2tK{Uv6LC{Vz2QEJb#3g9DJ|v)f(Jnb`$?W4mK%Ch> zR#FK7gbKj~l+@z;ndhmU#V0KnNc=K~_#rQ&5gn1Yqmu%VSOsoHx8(*~Q>tr)S$}By8|F zR0=>n;N<;F5F*Gelmr2qAslqo5q2e=JQWE++%sY!bZ2XTeQ+E24%BXVYAJNb$wE5$ zM2iP%-_RL!a>!fa%6^nWz!#tu4q4B2G!wdWMYxxQa8EKbF9_sx7U<5C{kUX^eekR- z2xJ8 z5?7ide3-P>%&GcmxsO1E+f{FLA}ZF(--IZBrNo5nmxuBaJq)$tja^6BshU zmvnMUx!hDp5?lm;Xd=P}3;Yj22|z11T;)Fk#{UOkFap55VFUrM8ml`<11N3N9011s zvv*u@7Qp%Tl*Rou51c49KoAu5UzUS;5e#H)d$xkPqy|ufR4ieyK!KwO1c4(?5GxO% z5MHupHc$?>@hHMWE7yA~*y#H64_Ns+;*J+O6SV;-7U`KKYz@2C1SW|{Js37Xn>$+t zd7jJfy&`zTDd0>m9Kw$XG3<_v$_&1Ll(fPfw&h@|e?5c>rQ)JfJ84iU%B z8-f~Q-|=>(K@f&4NYQ_8`K1PMf+S54DME{l$e0~cL=n1e{AU^u@zwQF%j?bikAwI3 zR>}Y?=f^Mz+>SZ~V%7%d&Cb);{bSxK_K`-4D#gm`v~$ykS2I-0xDhe zLiVijAB1_9FsYTDq1aLK9AOsPjf4`09<%+e;Ngz#n)(m;PYU9C43d`YW3R_& z%!YrEigK*&l2@wO^rQ_kn$p@NZ_Eryy<#YCjY~Y8Ix9mXlt-5*Q(B|vK zpdB>+rRQ-ab@WAxg!8lp^U4i|B$vPLp}$-+#q36V#Ry(gB!@l3aimWnIa)L03Hx7p z_lk%znLGp6ygj+`@}wv(oy@`6j9%g9a7zii%HhXvkZy|ejA4)&qm|e|2nR_jZA^+> z*xDFg-c(5HiE& zz`4UA#X_@Idp~Y-B_|Ic5^Ei%R89_wXpoWJxs>g8t1GI59~Suq+%}=X39ot}_Q=OE zKa0Tmod#MZ<4-$iD?v_l#{h9?a;u z$e2CFi*vRjDlb({49Z}9QVL9i-;I};hK-Q|;}bkYS~>6X*NR4ggJ8nGkIL0!ODG_; zSc5;hv_#gptg~WF1;@$4U|HS68F%@WNECpGgZyQu#PX_oSXVCr5steEH<~FobyTm zLQ$c*N1rP#b7|aNFR~O4yV$TS5?Hq6Yn3k?VeuC4VBh`Br&xu9R^W5_bcVhuu(Zrl z+@$twZ*4!s5Ha$_A-|qOj9sznr}e7kuU`}vV+vwCjz4MrQhY0c${vI58pr#%-jBkz zZn~o`X7`Z_KhyVY|7vUDM;(y6#s20NxBDi!29@?Mm0`SWG2t)ht$tUg%eTB0c1A70 zpiFo_U4Zj53$FAbukg3TqGy^ZVwD}l(oB<&RNld+d;q)kUa3oQU5gyo=h)B41fM>R zP7&B9m-{LHa7Q6%oWG>SG6G54Az{eGR^$DmOD;s+=3ApdMMJadPsz#Q2<KobeN(lFIgOV{Dl@~43xpEH%Y?7$WWngZsmv)~t#U~pNL7(k=2PCQ zm5U_X&DOZJ$flBt`!ofineh>mgcHR6Oe}G`h*Dk|G<3oZmB<;)m{?1)pJ(5F>muk!=M&PH{x3+vR5_ zMYCOP-!I+wUbUPkmwsVPo3pZ}N=MhI!Gwr8^oND*t>6dgawLhJ1pXM%CK8l0w4e~N}mSr*E37|CT!ffa5! zJ-VH^-dbbNf8HBWBL*7(b3EZ#_HRY?d-mf$8~vg3UhISKtH^videW=QXo8Z5c_6{A z+{SniAk`#YP*r{3R-<4(%42yp#oTc;+r_rKBIJjLbmkvGV@q<_s-h9|$xy{aP`o** z2eH_ops`@9gpZn@%q4P7N|eIrp-!{c;AOkK1!;1o_U%4$mKFI8#Dv$SQs5QJs|fZ) zaKpe6v58Mz0ZOF7@C56-o8PA=O5*cOsNX&c4iD36050c+tBAZJfA*L0vR}NOJwR%1q^#nW_-Rf_N(gRSAAH_7ljaVii8o!=3}FCBxsgJ$(Ubs(?^$(z=Vm^QFHI@Hrl9W~PXpN%3=6f|er~9;n3bLQaf{%q4 zMmh9aebBhpk>?=eKR>EbeV?e^f@&g3^o)JoQCqMnLNB8grdXI*?#47h<*(%{URUMR z@>42DOQ~xYRdQ^Ib_wH6kh3Y;GG$msD|o)iL6-3VuUk6m=eIYn#2*+*Wl?xZ#}P7! zVc|#dSlymvG%mzU>mAD!Sa!{kNCQBUA3MM zbq`zzKW0tcnId8B5t7mG*82Q;FLEcSC8A+KJ@DyS#JlF5Rh?FPN!=gqbSpd7_`h*v zU-HLVk&lwgOsKp@ z^_B5a?daiV*u8hu^i&~?XsXE7ef?6_%uN0Y59PtMY$htFq!=Z}oaeUpLs%x61eETZ zhep4?mHfZ{zwT5eYl_xQy;7J8Nk83ZrDZ1bzIj;TH0sJHkdDpQfP?GGAAIJ=#B1YYs0?@)IZ1uL3#BI=GeR zf(7s%Q;>q^+AP0vu}omb6Q*s8Dvjz5efIO%)-?rf?_p_YV>GbMuORe#Q4#7&79Awf zbx+yPnf4ja{Skd)*+`G_CBX5y=gLXw0)*|gY92&;P8}q`E!a=oIvw{1cEj{zY-zcPA>|Xl*g|q*VV^~utEIeN)0Dp|6`b8 z+Q8DwPRTDvRBfw4&aT%Q!=N_(cKBY__!X*S#!p+LohH)+){O#dfKCa_EW=u6CP7a% zrwk9*d9LLszLq&Vinu(oA|>0)n%2a0`&xVN@4}u>RU~KpZqkCDg;5`Qhb4-`2A6WA zQI6tfk9%))i5DmBdxAW<+tztzhSXZ7M|F15==Ppi{o|quvj<__(HJZDKrYIkpV;5a zMg%1cr5q$Gd=;3|HZbl($s;S1|Iv$PSTS@*<{Y6>Qs1nDuQ_NPPc9Md!y)lCH~rnj z7$$)EM~y*xpX3(wO(v@*_p=(Vb|JQx8i&Rfwfj3~+Z1Q=3OSD;r0PbCUM?k-QDzL? zt&HFHyjY(zS1@H4cBR%{uTmOYQb}=wPrxoB6W=eyhB&;{o-c@~ zN(x*goACPkzD(wy&MUAE`^W+Q0 z0m!chq}%j<$>aH88KQjqcQ3&DkHRMX@y$E<#iursyidGUBO~_rsqK+q~udw)@Rd$_!Z+v9&n#a+kH(Y?wP=AUEpM>uAI-5C@x7-?~@CCa}-7-spa z)b5|c%0YBWKojmq0Bg?>mc>tdhX`}}dwm-laWEUFmB?Wm@4YZn+ zPas{`>&QFwTWUpRFtvS+0TMo6Oq0DbZq%-h7ufOXo<)(?6bF(g()JFp5|-LnL-L5>x(oxkX5vR9uopF}JkMu)bYmN^3%a7)=)n;$kLS-G7LUMoix zbIjUpt)_9R(!h(O`2NsQ;c-xViLGIGzgXX^9}>fm1iZPNg32}NsOvG49W;8W1x04! z6;G5BdPK0-W{{X-7u!!fd2#MLGiI4~qFNQSX9=PnkfwV@LKZ7+*e;uA;E z7{7DYTN3XWsD+mJuZXSwhyCc^y{I(K#JMjr0;ZJE7OdlM^dsg!C9QDOqm$9RUYr_n z?Gm^~hj5#4tw>n}n;Y^2%oH4($d%*1{98wDsB;qI6&|n2=_;t@Z4tmdm$TVA@Ro(ui>BCfaGXOcVR0SgfF&$U(Bb z7fgmCvko@j^qD-zNW2<(#Vz(>aT%l(|w|=t5%!cd#)%#N+qH^rCaf|U-iz};SKk#afhC}vm z3z@0vB@uo*5jvZ8w$ZCev_!k|(VSI*i3ah{2Yl;ily2F30?Nmcm}?x4M(VoQx$@$q zZm+x5Ia0DWUt;w`S;n+EG^h%4byBwTpnE&M$?4R=Sb;9AOW2pr?(dOi2Kt*@6pOB} zs;{vYR!O)V+YTf-Qq70`@kMo0|EN8e>2-mErAXH+d^`$@(JJqOyw?2E)=aWwK|gK|rKW)7pFwz64ZMK-|~MEfWdRDLV7bxpKP<-Qgf zwlab7Fbbw=?HlZFWOFw0<+}59wYqc|;d^~8JXeCWQsuxMKTh+O3f@Ggx2tG5|8kW-YP~iHW*-MLx@+w5& z3&-TnwrYf;WBU8QHmPWg3Dbg(eKRcBG?omdb#-5O>c^REQ@~RsI>*61ivv9l!nz?f zcueSJ6gB&>FuQ>*<&W)c%>kKTtVZ#>*|?qd0#B1(>_|83^8F?=rGQgl%Qq!@z%vzb=mCYT{}flX~;S{_Az-tM1L@Wve&*Zy3Dv3yME+`C)|UkoViP z2(}AX+-3}TPLAHpK-4oArEhTezDJ5SRHH0Yr}zdK+GCL%(TlJ8kTg5QD~wk$tg6QF zjdpwd`zElHW#}_wa>x^%8oMj}#af<%v1ft>%oL(e{*#zG^XPb^GWG4tO@S)ksK>yc zHH@8ORhQ-HP@07Gq4FwD3!%h&{?!J@5P^oqZk-#cJ!773no_>BK|#JPQ-GDVMOS-^ zjoD|VtgP&$&>TVTQ7kmxYc_M!&$>B!?$Z=u7FJAT4HLv+4eT@uF2>2N7@n%ZLeeZg zcfW6;)>ARapG0k|9P`Ok5AYzk1L5JqvbxSRiM{5($1o2g z*`NCB83BirUA!dJIiglXk@cwl1hmN0=|!2;wF`$MM<4h-6aQn$({|rN2?Bf~Y;w+M z2){kpQ$>hULj5;u?|yqq5PZVZaGdH-CmL0mk*d%N28uPuE)Ep0gs-(1ueyscA zw}AZ@+SYV5+YRvVD7(3Xf4}L9%K&S;a*`i%*86kIm=WtQmBo zznt~E740iMzoxSKGms1=jM{ajzy-YDetk@G;R6=nh>s_%$lnnpI>tz*^? zzClxGmWd%h#tjoQaJ-cNSncvx+ugIP5#w|3fW3(1B-$9P-;JNtUT7s6vBRpaZcroZ zjki~()HV_7iYLC==l+#15BLt!mr+ey=fiZ)@Er4QcRPN43gz3#Z3AJNnJ)zLjj!NVfWPS4<^0eO0He4G-$-!AJ4c_x?%Zic*k-Y zLOG)RVRzo`8I|Ldi2Mf@O~+@D!%LPfU;i1<&kQAfLJ_JdE+`<)Qr5Q4Tuu}|J+)+Hj5`AeZBqFFYZqa>4ZmeYU^m1WNIF22?p82j^! zLnkStUdaSOmAKM-JHEsfp04$f(Lz0T#JUrPkeA-ue>lGA(Ul`N#kfJj@pp-dj|?bn zTB`BuIKsV3IC7&ETS{>p#{XYeZI#zC|MC z?H=uPng0C&WMmt+VcNyQs|EZ`!np(~Iqw*~w}B_050~LE$QQT%5b3GIgO|&&7O_c? zjTrU4Eglo21?KN4+y}?%%8#t2MOeh8lfUD`tq|<9r1K?o!TSXn4b@&IO(LN zY8nPBXO$8j3ts5yMV$FYk&x>5B}HZhw%4>gJp7w0%_yMEg6|dIZ z7R+?;EKj;fkQGB~Q{-%_@VV!TDDSSnKx8cY)f3yCMS|ZZd3PiYx>tVCB)c^#Jy|%i zep5Am!Bh9H;rrg*4?fvVuk3_v7;X{+w{e2zYri*kcRapOx%V^R{eEMwFgEf#@jE9@ z87=;+^ zzx)`QXS6r}@?T?9T^amB8*uUY0Hsw}Ykj(Wy6IqR$ZOiG_Zz&tB)nZ%`lsnvE?(o) zZ9?=VG?$S7JgJGwR=EFoH1&DH*v)7wE_6D1s7K?7IZMYt$k&5P-}SZS_^;0pNTn8@ zEY)9B_b(?n#TWu@yCSX*sZ!M8BiO|+v1Fs1muDZG6jFAJlp|A7s4hn}2_G6E9p85f zT!@6?#zouZcd25!FG3)yp0ZCkWq*6esvR*M_(v1)KZ%!2N4V-XsW7B??U%-@h&NX= zWa`^2Onz@4EXfoJ9+$KC%On>*SB!GI3_(hKPtm)+Szzns6mp$lovJn|{`aw$AuGdJ zRdRyvWHblh&g$HxbjmwGACKL_`Sjp<#4$KkMc!cg%hlgSU)yxsO7f0tgjo6Mwz5jQ z7ra|Nfv<0yF-q*oR%(NS1lJTSzKkc(IDFoJ+ihH8TMot_!gzg!+$lo8A2^KZjQ30+dM~AtWyv}VZGz4~7o?0sq(lj;WOTb)?lSz-OpJ3h5}zUGCFFpw|7H== zkXSLBxQB&Ud>E~HS&UoUJi#0L{ngt!CaU~29z6GtaS|K2f|vUg<={@Tj-XjSeon^V z`LR(nH-pT3QZq5}H-g0l24gYS7yJV-ebrICU74>svHyN~!XhVR+dnWAtY42;Zl+Oz zYqIj1od%Egu$*E+I-2#SH?t`6*1{cF8nn>irpXF}*NsJ}%E>3Jhc+rPQ`p#nTgQSv z#O|ipWEX5l1*Mv}IiL5HaopxsVLhC4Mr{Kzc6uL{!aIA^rA@Zja#sc1?p2s0-&roP zgi(_=mqv(j@&e0JuIEPvYPc<0KmRN;wH<-CEODV3F;2?PJo*rH{B;XAN`>m$RDo$< z%h9BXR{F{WOYJsDt>(knla$rQHuS4o@06ryCms}39xk=qn@PPGeF}a2 zWT0Y)w@|wavluR2ji=wl7j*r;8lemBEl(Y_yWA^Dd-0Y`%!-JL+G8-C{;*qT?FhJ? zXQ;B6_ha@j$6bl`HrZKpn#28#;yQ2lFK8-h@?rMs&+pm&K4;d!+?ZM)O2!`5>2=cc zdFPwK{b%*cTE{JOxs;ox?~Jr3wH5QC1A9Ds&@kFqzK9GVO%Qz3gAUW>t=f4F1Fq~q z3JxXap7(^jgKKV}9`~flEFhHW^b4s6V$Vzt+hAauNxHeq*l?u9qDTXZm!^8Q-Aqn9 zv?}8_E#@}(-xWAb?&X!Xxi^gQ6Cn&d#NAYe)1nS<<^IOP%XJN^=eXzb=otzuryuwf@qAjQ@lv<__q@eV z>?JgK+&9kXCGY;`@{0TEOcQU0*+CAC>5O6ZxaZPQ^7P@Z*5|O)1MRTX%lD9x`0>Ee zhtJ18c85p-tO8uKNDt7)+IG0HwW6L@X}z7Kww3%h3o`cg3@}MnstR)w37w_FpB{{tv5o;?c9OTb4^FE`&=*lH{SCVkh9re+K*yS!qR`E zJkSf`bjLSd_vm$(6TeaEIj%PKPw!9ymlwWCo-#FY<6ziOD+;6z=%~L>%L9rAPI%vm z>-hG8_a*%i?~E+v_vX)%w``T}S{5CW;?#QPez6tCJ{%j`e_+r&xwE_1oA)cLUICeb zRy#W~#^a7%`;G^bFXeL^nAIKo-ZB>lhG`w=wGJs$k5qRtg1rabp)PA_ltc8(<}&K36_p&clDZl7 zaP)^SV(>a}uivrz*gh8Aqnx?o{&qZ8oOgvM8~?h*%2wh_03TQgIK$p#r6Yf!?&m|7 ztZ9uHW|oBu%)BZf=(%fMmX(`ku%T&^f_*?VCxH1C8VWJ43?{r~kV;2|*q|>(zxB}B zPQ&kh(=Ys%gZe|0{x)}^=m*&k24d1})A(TdYd`d?GHlTA>Qt|ICJFsOsNk6s>8$hm z^>4yJEWB1Iu7_S)7M&K8xn-v9ss&S2f;vRJw7$14fR1^OA1x( zHe4K*zuC@<^2uwjhWAbF8$(ytr>{-}BQ%cPvO%Ks%B~d2|i73z0$+8Q80S_gZXf%2XI(Ar{SvpWGg=0W6AsB2t^kpYrfz z>12EQT`&m0mX7>4R4f!t9{pc!*3KL=q6^M8P)e8vTUzJ=sgsGSE(%M&G$Kz1h8s%# zNhd3Vf%xup*^U+^x8KaR~0NL6R^3 z@8q0!a-Qs)H*@FSeVfhBKVqg}XFKVxq!k)XRabF=n7nwAa)@NB2{R($kt ze%UG_JNal@`(S#7LLZ>fkQ20xsPe}!^OTX#nw~Ll!4|Q0wwm=tMeLF03o*mmKO$nW zZDZ}yvzcYzp)jKk=io^HnRD}x1A2M?ZdERSeS^VrlB41nvQk4oAI`a$3$U)6_m&6{ z?|rY#@3V+y$PiKTSGK==5fgu3dSf+Vwe;dja~U(!V30^Bj#dm;c0*wAdzoO$;+%_t zxw2JkARR}mfBL9X%&0SAD%Mmyt&Hw=sP}8jgsp}UdIfZddZ-tjxu~JEIXH!)LDSxM+cWcSKclYHHgn@qjfssV1NCICC(L=d=pQ;K zl1aUzqmcSYM=PbF7Nbt8W2V!CS83#8cE~Cy^NruA5?fG6RCPEqi$^1JgrcY?s^{Um zVM_0yg13EcaRjE)N#D1qtxAgZn7Oyw)P}tOdP}?S=5Sps4|%l7F7QpuG^YD#6d3E? z2=}Bb3Q&@+=_}Oq)_s5b7EQimc1p4&>Pv_Uq)nxi2aN(m-o$r8ib)#2Y84H?XmG8Z zVCMctK?|&<k&uaA8Bsg`;NZ zc8+OW78D(vo0VA^3~#N<)!673FJ9I!-g;r($5VV^UF^$t`icCM8R(V7AWzIxk>J$d zRUz*mlE54IJHP?{k&zmmYc!25XdC?99;X;oBd=EXWSV3Fd*8=PtqydG7Pk&Jhs(r8 zsRz_0J_OWZn=rB`ko4p907n8huV(4Aq~-V+!3ku7`>`%~s@hX%l1Qvo>c_$xRcd^9-3890LT z5jagm?vquF%{5BN{G^7!T1pEucQG(5;P^Fu>wi;tbGj-d@9oL*Xsyv6{b1`=iP!Jx z2ye0owt)MRrV+$&2KaIWkie6LxCUHIyUS<-+LwMZ2oR>S25E_n^T9vJ`38gqTmu~X z4yayx2M`|y+y^%C2en`pOnfm3q>y4F(qbQX#F%7)G09huejK3Y8Tm{i{575Rb1f1r zl5rY%tem`DZm0sGHTyU*Tt==r;8>}J{un|yc*UziGVMxT0Qd;3p|vKo=EofO4fFue zV=WK}UpONGTEOB7z!>&|i;z*57gfs9Q;w4{CYkYPwZ?~q4tZO@hhEcPYd6nZ{rNHhkd`4xB|2ij)@!~c?8;VjHxA=QG;pTMQ%WHR7w za#D4#{n&vH!C!&&bB<)qZ26h;tv}&(iwaNoh*e135X`#;I=K%=r_%7_Ax0UkvD5^V zSA?kr8HF6EJn#kkgU`V7 zjXz(t9@j_Gz{|q}&~o>lofn!R_c3^vO~NL6qzG)-kaa<64dH7GP)k98W4 zaYQqUXzR&7O$apb8rz-fb(1Ed5fhQ?&ks7*=pWBOm^^r-P62Jmfda0ffU9hrE$6u& zM|ingv-4=!*Z8_eSnGWR+i_XP7{Pz^RFg@`bqcaY2a#RSHrBm*WTn**b2F>R`Vrin1z zK!MrE1aFmF47>&$VK0!lQT6^hGMzPoeNI z@B+vhCSzoZwYBnO3utSPD+{2v4!cX0M+Ry6!&{j+__Z`&EC6<~#)m@_Wbu*MSN4HB zfFrCXDhytR6}8HLYw^KF9LD1?VD5aB^Q~VD)duVZP<}v&6MV(0xiR7ZjnCm|LE!Xq z_X7S*DO6LYgkP&M^fCh2cMQJVOpxCWf5 zg}8>^nrfV{K<||=mb)?0*LW9rFvh8pn&CbehTLz$JqPZ$VSeL#Zv@)v700*;Lwf)3 zb`Pv&f*KIUa1;0sRVMU7E((JM-L=X7tcYG0pjDsTL}=Y|0N1DeBII-gb6_`rp;?C_Z4g? zU>_j)hwe&rsT~^=SPaWyf&#Xt&^nVrfG{*l9J7iK#j?fNG>zkiWlf}21j2Zp4`Z(* zhRJ>fNH#NqNfw9_NHF(xR3oXO+Nckd&IGu?CFGXtyZkT)%gfmX)B%b97h4#WG}Q(q zWT!0Tt2EXX&{p~>vMlJUEa4-iHDp`^Ua1U!47`@cJ2%9;CxG8=QjW-#f_pb~51xT;tOHZGFB^9d@g9xJsPp$~Miv{tS~kJK`7_ zS#2bqAeeT~mOlj20QaQ{2HU%sYy&)w+#(z?(8h$l0=tD~fdYew6+1fSYTUsahklHl zjpG;8ODM2oY?t|;UMTrA%Rl9p-ht6!R1^K&i*G!goj$Laau9D?C;DjZ*^ylA4qYAz zMia3x8m0lB-thJ!{{QTOyPjReIniIg25P5&OWpwC0 zumfh;w2Nz7P()CPSN=cH535j7$l3ijrARv-II(9&wQjJ7c^ZOUSq%6Q%fS`Ne9{>c z;cqY`h>>KmeB&&>I}9nfi{_pHkl05#34D@)*K|0TuQIsjUAHcKdBxPXLeI|u`c6I9C7*vJ_;hyjRV0+nVAZg9F2V zt&#Mw8i086AWndKUI>{CimxqssQ>8fET$lZnEiMS*m6m$MUV}Yt_%0j=oLJ=}XCxQuJrYT2<;N zxu40nPcuDHK`s*@ujC;Q)pI!yhwTh(Qk;tdOA#+FH5(%xUe#3+@za*J{`^E^UBu9k z{aJ4;n3ZaNYNc9RDa`Q%CxQ5WPw;&?(fp79(6IrY02JK}*wKG3%v16WYOSfr!Wz~{ zd>ZvF_wm@IV>uwc3ZV%wd2&lgfKrNjfaEs?>&W(aB3j%m3-59k`H0Ty@cqSn09f4D`pzKWL^a9ZCd>yVPGADM zHBt3B9NWQO0o@J_T*<$wTPy%)tCWKE{l{MWi##vBLv8KQ@ImI$x%o2+TbDmStc?CU zXIlhM9z_u!iO~X101uz+?se`6F&iIle|E(3n{)4!$qWBTs8{4Uzl!EyIL^HBwhJ4( zj0lTBJLhRD?RNw?L%3aWUa*<7y~kWxX0oo;M#QK9K_ZsH8nvloF8BE9zC;0 z3n!4OlsUanlbRw2t1Ldzuf?fG<8;)1qn-UD-v8<2FPvmCSs=o8D3+Edaumxx>#El- zX>lz-#nB;N`&y|sLnUZ9;z_Vp9@C%AiYIM5&0Oq=D~(?ezxaa-tN1c*RB_bw@x0MH zVbn|K_sf^5zhqq@;#SbFc>C2QJJ|%t9$8j&r*vD$k7}q^6Y!NLO#)tp1OtlzHEeuLMe1!(@uLdX)Q)8WR znvSp_*+yRKu7={JM2b0c0ZMlExk5{Cj{3EbE`)BrLz#;Dp>j9x^vf>Z`|yA7)+k^S zZ#2dLEnJ^3BKBZBdA0B5*grz4;ND+OG)-0Q{;05vSS`5L_Z&*3w`U}@0rukYD?JP^ zsIHIxTHoI-o=N;ZiZToG8#scz@M`Tywr~FeTp{wRYELBbdg1(%SYrcGB=V`l^JTnU zp2;fDPXw5&9eZo&u`*opt?^s_`uea{*LnG@9&Jpm3n6!w)AdCIj#&AdH?C{0@72wDJTx`k(fT)HpOL zay^{$%v^(~zW$+uGMo5{g} zt@~?x1#W9gJ|bgM-oYjt%H@!EAceJs+<`{(yq2qbMzpvrDl5f$`S+e^rR@8@Ar zjl_p7D9RKM4fK+w&TBEr>~$@#|HsP}P{D=e>l$%ZqN&5BA!42t>O^oFTM_!eups?7 zid>KQq1T!7DesS$^|^&x`gYIuBOT(`e+p|i@^+?2$OSzR^hn_AqVms9z3knvpLl&K z%4Y)t9^1d4hwkT|RUDx%?QP3pfYm!RIjCE3$7+fJKe4X62c^B#N^=?;a3SAfv)P-+ zTJma3)MCmc2JPRt!9k_exc+KTCNpnI|0BYHyZ0aXU8*l@2^|=gGW5E!KD<}6U5&-c z{NX(adN6C?v-$A#KKi?1vqaFi+_n2l=q+1J82UVu;|s}vW6c$jDDlM` zG+;I9Dvxnt3ZWWvp(6Bd!|>&T=-hw*B5poDXB43Uq(4E>V@(q59aIHpR z)8F?Q98h6ls3E9J`SR2h=x4}|zhQQH>kdCX(Q+l_zbn z{L!y_$8R4-F4kQAsP7JP@|# z`XuQTS?VWQCFpkS`#;*`*{Wg;k#|@2G;JL5gIy9GR4ZKgL!_5VLDItVI+IJ}6FouS zjrj&gekdTnGa%6KNsb9-+=qB#AUcia)y<)T2Wr{TWdr$)Eirc-@=c>uWmt z#_PY&@DzaNmiO6`AV>C(j%s`_uF>cs9^P!*2N?os-j1msaqVO~tEDleIUQf7{JW$tT=%`3qN^&NfYQ-J5!$?eNJUld4ro5c1bb<@)%*0eN9$ zAl7>HOn*BAGL3+9F>9D=t0evH-K{ZV4>!9)-wS(^g!JFzD6{b#|Kzv%&8vE;yaT6@ zzO68SrM9IP*^PKU#_~S%D23M18yLW(X*G#u`))M8?8tQcjwEaT)t%7eeb>JzO3S>i zkCHBIv*4>u*da+i>&(g%Tk89}Ic)}GG|sC(R7Dx@+oFY%P0EXgcycDsXK@8;uDdsv^`@d4A zfmY{1PkBy1_~Aq4Gf39n?>-&daqH#I{L80yJybBVxAfmiJ5=BU|7i-LgY*SxgQOgd zXIjLON%s*gIoVTU0?H=JiTqo$CQs9s5k@k}*M@TCeMocEZjcm(S@ljLQOewpYbcMK zz6}O7h5n89{u62J)&w6v{vVFPyeB{IVS!FF2HFiC)-JG&aB9rxm-CLZ}nH@n;+?w3bdM-b)kodO` zytnlOcs7D$%gP7$!=kZraBk~z=g~InzL}4=P_M^~ZR!Pf9@*%{99{b5{+=5MV~+oP zhlk{@nlpX_!RZ+%f~?IVdqzD>6C^E$H+s_!iylR)LP_k}A^jT;g_VALPHZPI{@7F) z!A5QjR+Be;YcI=R{UTzGZaVKT@^r6!o>DkVDzm z%QDZ1dvIB(+b=(S;G&6aJy!bn{VBBh%6^Kqh2kSaMlZeYtyw(LdUT?{Kh>4fZ4&E4 zX%1M}nsgmRxfQ;P#BM|H;Kq#2BsnWQ!<~ZM{G5XLOVY-jYZ8qd|Dqc{&c80hX>*xX z`P+^=8}2(sK8 z3mJqM0=Y20dn^rJ{uStCp3S;ROtjjwQ{BA!q)lX%t~gD$NQyNH0YzV^pN;`wQwul! zH%H|u_RZb?*h$hf(NG*@f->H{)ZJEMZTr{Q6uLn=tKTp<^s&A$#4rCz1um2YkrN$x zS{qP7!;e?W``iTNH8c|G)$pi!3ut$@KFB-nysmb>&p95vEoZf-PWQV`yEyVq*YtEI zS9$#pac_Q9a@}`+0dq?W=OU6ugS_|exH zmbHzIh6I+q0J=>bcmzRZ5WrCgwh4)si4pn@0~jQInA-m#a&RNMKwQ$wA9T^IPr9FU z8jAyslEpjJpdwo*boO;nzB|#pSLu_D*hb5eh>Pm%1K4jN9Wuf z882p-9d5pcwL_Fq2Fa{zhEEXp13Ol8wD$)tP^w3H9}goLX%wCpF9O;gB9Xmv>$guc zDaI`0<8S5>MxW_RHTL%kJlUm^<5yk&@qLZ0LNWnN5YZtw%J&CJ|y)C8!z86e8i$ z;`IPJB?@T9okZ`yzs%7@J|>+K0vgb)G8FV!vM3d>-hY3LG4)x2+0gP&WXrk0+XmL# zi~zk<*2&}{*uE)#gHZtLWv2~KHJ}3YAQ9cRGm-Y|T_off4bVJJQ9yQ&wPTrJiN{(T zLgiV&{WfR!k=crERh+<`9<~lEfWHl0=I#R<;sUFkFYIRJi7X`UvXp#_j_Vc{_0rT! zXpr=BU!PkBWh5G#`ZN7jmQ}8belpuS{1h4guu=4OyY)$_gwE|P&;-lt!Q0Swwptgp zEB#ajoj6|3t1?^k@q%)1wf?k~z>5&<{N>CBhw#D9Jvw^L;*Ftr9!dY_1i&j5KxZ+2{UX+KIwF!$7Z+A(F=R|GFqsY3cJ{%3@j^U4r~)6<{vHwA8S?< z{b*9Giv{DpBMyF0(bJr4NzW3T8{SJ}AH#OKclsnoc((FgdCb*m*ab1X7|YqHLHfZK&rXIhC%H4=M+=9fb|gfTZ4(UOVQ(~fn~`}Fq(b9 zD83$bcFT__3@|mX%}?17yx*$c-+WYV`)~7C6OTH&nQW|Y)x#h?8Ie?o_8W&)5Sch# zg7@a}xiO_HLYmFkxC$$j?q~|e;BJoXD#`gE2ogzEP|xx>?lY+zAR)rWzJ9^QP&}fhrzQ?nT9i%_J_J` z)&p4!RN681?hXXS``VKo+gR(Qu5i8itLBee1xMZ|t@r9=5c;=_e*45Zw3Q)L$T%g>RGoJ#Uwge3Zm=Z35!Ua^^yg_c1$1&8PkNAH4~W z(ZJPSvbs5B`L4uid&Hy6+I@RM1-y^Vt-u7PR(#3rs)2%K_{3coIbD~$0Rmgv00eh@PNwaL=>rR zU6i}FYk0acn?5``E3^j()MKF*-R}33H!a-X`dO`S?3fmrwHfh}NT(&d=o@;LEG03T z38vt10`pFNNF6vxsaNX4O>sJU-^6W5i4WQ|OmXJ#q1?;}hmI9&FRsUYpkiA9+3;L{ zp!#@ks`~1rqW`bC{GW;wRdZ9!h=5m9I~)5U8ZHut-{A|;w1Z7Al8J>74Ov&3x4|Qi zSbfjvdQIz%hjx2zk`hnl59^}4b2s05D%Hz6LWP_HQ4JcRHzGy#R>!J6-~zFteCUg< zKEk8SomE!Jbq$k{x12+T*6G6iuaw%*z$?s{Lg*^VcdE&XjgunD2fT(R2KXoY zSI9SBmGaoDAAw$;gqzqm8I;z7n*_{b_3a(*W^U_N&T;m{E+4|8~i@dG=oAH+I!xbCJ!s0-T%%}S#nbMxS!v1YtQGIzD_$>ZLeod41l8V z9fA-orj+SAH=Y494@NXnwI)^nAOTJ@K;7owFeq9GVF39Ss;9GL)y2IxD>$aY$&4G4 za{^;~*s4OrO&pbn++&R~`x!SD>TT?gwb0*@I$PmC>Sk6lmHY4MN9~KLP_|lPkCo>1 zbKdB%u6Ya5XYWG%QPIaCCX57R;k)e6D`}V7>W~W3b0_P2{Tt#s{vSgSaja#M0pRiM z51`kJ)6I)N(YvGj3UR~tCoq59WeUi%HVfPyG2FkaI4!a`sEq(8wZv6G@E7_2 z^|P-q{p{WHBl6oKU>lnv3TffC)5^0%4%)eg4GmwPHXI>msZpk-pAjg?X^gKv<#E+% z_xuN;JY2FHbfOc(d8<5Kcz=zHK_4vqJq!%xX@;*s)`VCt9K0&r;VeGjT#8DMLKm8tJIq5_xXUeu3Pf?E^ z*X8@U6wtqeR=eW`&bP2j#Ety|fOD|hC{Ke}#dlyG?j3fM^RPDuco6Ux^b5@L-W|n$ z8kD+MW2^pBa1Z!$7L2Ng+d?B*q3J{SgLajwWfJ3EG99daU9Nd^2Y8e;!y!hpwLU6% zUBQkL*G4(tgOFm(=)BH-|7yPW-eKuXVYSZdxdRRv3IcMs-qBXKaDmfDfBI+r+2MH4+_PnPf9 zhQ44ggMItU_=@=AVMr!n7M2#8xVPza!%qrS0NWddyCxa;}5s(`2-=ojkBEjzr2(Fqfwimr-)Rz`~2%NT_uzp zStE!)ZUEMT2B|fK2EPI1Mq1^&$Bt_k8E z{ij4}g+s#}IJIuB6Z^)G>p=G=WJWGrU&nO59H+?ArtIbPXFZfbeENBvU-+?=o^H74 zyRBnN#_?dCtR}0{$6Uxk7*`&S#%~W+u7f-EGGxVU=6l_w_TDp`lL2DkNbf6S^KGTQ zLR=aan#J-;KVMk_D2FXi&5nHRayb{2XUr#iaCLC)WGw(IFpZtqbM% zG;FmO@SPv@mFW7RS3x#Px~$Jgnrg@YlxLJdTO#|d6Nz8MWb=GXSxd62rp_6*h5HnD z%Y(LPaN15G#WKg{`%=uyQ`sgF9;KCf#QT+Q!|~Vjzv8cdttd=<%Kej`K(CnB!V^oF zE9WZcS)KpFNynT@0b~_kRX|o4WY5@p?)cEjjZ~JHe`Zl_?O)adQBJ1(oarpFogn z6E`SF$ao_~`vG_|$id2)|AlJC`+NE$%ikfT;*p-OGx6Ipr?8Kql$j?VLss;chY%kq zq_oni_m#IO&@i{1RM@#>m6o#Toz5CCQFR94mZo7K{t_L+^P>Hwa4d@7up?dg`p1Vp z;c99=VHPT5UUd7BtuyaV+b8-H1=#O!lkM6#`QON0s6^#2S^@ClzH2+xR$KmBJ=O(n zhWM{LiS{2ccZF&9)H7pu*2Cq{ANuEi_}ZK*krgFzu&IZ8D&7~_WgdyvWR39h+tNXg z|H!IL-rIU)hnhvq_>jEyXnV~V-PlDUr|vo5;vIg+zCW_9@Vn)``Ded9%JeDEQlXjV z>E;>VV_U*_Z;8^kx9tr`@U1jevZ#Et=+?;QxP$_Sa=qU>&8|keQZ~|k${2Bl zJp_Y>DZvlTGiKSbLZcw88M;!Aih1-L^j~?nBx}21E~8Vsani_kQiJa5WI4turL$9AG94g%1&6#A;>wqTf*dL}>*RAbh_mZCg z-9ODkD}Q{cobOm@zj6(pS)&OMK#F0B{~T3}{wW|F@j4S}sRi(T9k_>O^WB|%=n989 zsp{}#=`NV?9AuSx*CBzK024C1;&eP>T*!qkb9N`Q97XP!{73y5wEO<{p%CD303DdN zZ%w~Rnm)@s8Oa_z`w5N!tel(#GXv$~wP3paI;wPe8?fx8kWvI;bOB`8J?=#J(U4cZLk_*{O6ArZN z1-%_6RrqPaM?dlDn|%2f*uyhG>-0+cv|aIzDoJt*qE^_irJfCnG^g(CO?dqKNjp!h zW?>-Y80&ShKhv={G5DV(6Sl2*vFP&D&A7_R=fq&Cbpm(dd}c|t%YF2&vR6yU(J7AX{>9bd*rKSOxAPnYwsiKc z7rhQc=45RA&^FgbsP3J$#7~~l_or)mnJEiV@rzQVNk!Ze(teo?PbuJ0KBjQ((lQ;* zu;mu4= zhB08%x|zYK^RLE9~HxkgrQ$Nbp|Jue7zAxG|H+;q0G}mZngs<~xnyq}d zhVTeKRkY9%B3i1S#}WAao+j*@K58KbuicwOSVg|ex)Qwz1)Y-54R{d-wQ(9ns#$Cb zs0oopLQp}1I`i3Yl&)v+h9`nA{r#<{d>0%YL6ufrB}WUlS_U# zGlb~a>y$ng2kel9G;MreXB7-xnx$fbk;-p3JO@uXxhX08vVwi3mtM!Lw+n`|$49f> zOPcNdM&O*vb3}r#_l{XOSXTR^r6QU9y+^-1UB{`-sK!;kf*?Sn1ht4Lrt{#kX|ttH z!dk`Wci(KI?{*h;4c+3}wifcLFJ;Q=b_xARDtIN;S6OVMHF_?9y{H0-YrV-is&(Lo z_j_s)<`tH#U)=FC2XCWC)&4NhoGg(UehF3ttAVW(YF7U#R1Xg znboL~(Uvar$h%ZHJ6(ueC+lIc)jrn$&mXS$QJ;{K?s@!jw-cs*YMd$SgNuZtj#JLh zs$@y2KHilP@(V&Sw1KEhFM9)_-86=#zt}+DIO_^C*ihW8R5ZF{VnUI)#@ujti zvh)Y>r;g~MT7S4@H`{E!{(g|`o~6z`6WkSdwAD~`I_Ds}jW|m{evj@O8}4&4rb>A0 zmTUW6x9m~l>bQAbvVUgA?bDY&s8&*^@6bb;yr(CBi>Zu6rBS&N!rUosny##&n<`U$ zrH_sBb{ULJXFvZ9X+xwK_@4pkagF?WR#=WNmZf`;r?A_gRi#$j&1)l>aa!%t#uHx0 z$ZsxUeEw5?r^B-QcVU_>%~%aXr!v2|n-ww*pZ&%jt3JQJ$F@>@jCw>Rg7=K*=iku3 zq88cjEnMY~Qs|#%rO4I;XUF@0o7*1c`s`|zi`Rx&)&NUst)qk&P#l)kE*sN`l&>+p z_1NG{?fI0iV0nUaoR75Q+eh*8P`qcqRDY%nO&5&bcl-`?_>ZEptvL00b*h!5lhBVJ zyT11|@4#n$)G}WA3_J`K)$7=;jo<4#$9$NldU4ow2$XVh?7ueV@MiXyQyF_O;$qx> zc)A>mx3OjCn0MPXu>Q6A-G%7Hx7H)`K5v=mzJtzC3rXJstfsQ{u-gcF{ez_b8akS! zD8oy}uMs2CEELXSd-k6VwweRt+2LX*tYN6iita^UpHoADZ04!kVqNGWyC`zWkka$6 zC$zfhC+`m<;{46Y@!=4r`FaydueYwxPuyo;Y&P!MJy+Qcc9}<6TClutlgrWn+S8eo zD4^Q30a~i5xO-dj^RR_tduB zXj%?6hfP_nFgemrCL}hdY?|(kTnRhI%KK@?jV+7*7JfB73>_sE(fpYAv+)zdP1N*m&d0taK4Ik`+3eLZ+wuuc%`>z3hBe=8*`n1yf|edla^F>wAC{ zVy#Tcr>Mv!HgbO_`#@=Xev2^^xNg-4zOHSvpGkge|-Acfo z#S^5EnJ*OnDOR+R_>?ZAmyw2k$Ck!C=@c1&`0l7o zV)T!whvShg2WWV&HO>c?S?;?nu-Hz>jzQs#8QCr5_k3Ogj^kaNlHFwTw)4eR~8}rF$-Y5sS3iv}a>Mx_UB&Ud-mim0eon(!Eg20(Y&6>N} z^^|c1&u_Nr_qkZ`)(acQmIsa@TG5o0DG}_Seo&;2Tya8HMD#dUe~x@uVV!dPYJhj& zav?$!;qN2!pX^BiXV7sGJ~X?Fq_udKuJrV-TRsHb?|yA?TLRG+-l4k;9rK$jlh^Za z5vnBqFVVx@SYS5E^BYgF_=9_13;LZTa@L!_{}W#QXCY?1jbwGd5XFQz_+IE)?ZElX z!A^2}#aF=$huY1=MRlSjGKax2G=ZbHZ;U^#_74IKT(}&*w>m%OH)eP6(s{XrG++qpq zQ7PxA>}UN#`@Vb;PF~vnDq!A_lP))0GR*E(jS6k>KV-M1$oOB_evnQ~fEFwdx078jU!&VEa&cu6q+W zmJ26JEmj-hgY!t}1=rL5Hf1y|O`ra5F0tP5NaFanMDhERXZ_8=?0K3=okfVtIO?5(|{u+i^2^ z#_eW97hSSr3fKT`Ql>%&qX{5NOS|dkr4G$tknCVe)*IFiTF|yyz(MCDn z^=qBt&q{}`;zj1vTqKS<7lHS(axrhe$=^1_3}o}4zStk$YOX+M<^mc!p3lB4h(l73 z6s;0Q1%$bvv&K8!Oy*IUms~^5k2=;#0F6etAkKKvJv z+7myQ4o+v$jk-gixkPSyiRQjwjTk&D>mY{@HaVW0$c>1?oa26}0jH$Y%`9}6UKBe^ zDAuu@j4yrQvDcp3voKWc|0`aiv{GR2?@<+!bzSubS0=!gdzDp#x%4TzR1niCg^Hc zZJKvC@x=q7p<&NtPfStCmoM}sp(9Qqna>`eRjwMO?5OjxwPn37o(*lEYUiv zs8SP{b3JKZ!eG5k(!_B0x3|llqczO1M(V1gueC{gQkAi-bl77zmv7Tn!5s1w`YHd( z*AxR^IFP^Ssdga4ZH?xMgxuK1Rfn?G6~o+&P^87k%eSpXS#ASmje}HI$%M%GrE2o7 zC&2);wCU5#FV?186VqIf9%~U@%|fxSU^l5RQJl1&GJa%$TD+T^dz~MDXw>@BY1?XR@ax>4NG(*RyE?iiYJFYifk$Vszcan2v&YT zD#|Rf*YP$OTRHd?3l&urG__6M(Co~lJEU@5jtNQP!l6lP`lY@fQ?MR0DMu!}RXzf( zW9K_HmdV~>YjB!Kj~e6PK8e1nx$7a8u_h(6=5C`i)clXls0f#;H7tDiU_PYiszaCI z>FZ)Bfw;8Eco~Nm zP!l9Sy^ti;do2c7ZG7gMCNM*sfJpD#)RAlNoT@-KFG~Ufk9!E!{bR`JeE1{Bj$+e; z5yzIIZl%VY*ZJG1>vA`mm)9X;R(}n3muO$`v;U#+&}%hnjMO5_e@bC0w5j?j0LP}# zTNqTS<5DQl;#1I86}@ej${_41u$yf=+Wyx4rcvb!%Ltw)ztl`M$-}x{Lr!&X6o6;@$y79)^yK>$3 z!=a3B$ZHX7KlKWiC{XdZC0EV-KrF?_h;ug%5!dmm(cs(u=+nQcvBsbl`(~QkKNbD` zlqUJ!Y4sxwzr{{Ji{&c?{VFaI(XdEC+kBjZrH2CPTR$zGO}`$oFGiSWjfh(^LxG@o-d$At|T2Lr!XC4g#Vi1ZUV?|X-?e# z-57b5?(mi^T{$c%euiEY?syR<=qy`I#NxdSI9`=?56sVZu#m>9n>#6@b z@^ju9wN=m`Ayxi%$)+^Ytb)$M!}!EiI!FMS2hiB^0d1gF0ZyvI)BX9Qafq|?J`36d zU-x0~`)B3X*HbMw8Xhz~hI#aCM#Ke|wd*J9a-hvtVR@s1uvRY#CblL{Y({?{$NH)3Y1cQQpda(s{aoD(r}n=MM5dcTp~|8!o4Yw zLGE^{=3FpSX!VyuU57+Q6|```N#|?Cnn~@8V?Q~zxGAIw@JI4(ZP}9pn)5(EB_rj{ zY@4L}SF=-@I}tPW%JYZ77GWi70m8RBY=1I2+3H9K5+4vA%TtEP*>Ppb zCN1P0+C*2KbaU8gPZQ;}lI0gGz9A5oX84Zt=~G{X9E;r8v#q5cUD{47OzVOc^Q6hl z)CxfB&Ess{N-Ervb41}H@%2@O)!*Znd!20pJEo!|?GpbU@=-Ug**QO{)w|kwGZjza z6Pbp?WRw>>p!!p!a?Fj98}?`*`QjV0(+X`Go}yMT+mMXc#7K*XUoOX@MVlOn$4YwR739r3cZ@S59ciz}}WR%=*=0wnjxp)7lZn`W83MpOPNPA~pS zAntYi3A!=C2~Yt*rBDM-QUgxia9pl9YiL9jr$IUzNjFi_O<=82x=2gTHT5QSjaC}f zrCX`LB;_yQQvQNKFWZJ}qxQblWc*#XTz9ueNomtkvsohv7Ioa2k{6PT06!V=}E+cro$LK%?CN zq2k4mZz2cGt4#es4V)de;Myrh{?q8yr%=SO1a~QcZ<&k6+$zWS&vo$#tv4^fO5~o% z&+ru-5jZVYjuh+Jh|VKGJEmBMfmF!kl`7w_f%+EQMYCAtyI;IY@g7vO(idowrx>nZ zo+a;;$BRU6LiqSOG|7}_!TD3|T;la!9h67dw5g7^UiVg&jm_|jXUs;vUir?+2C?F* zA`mtxKVD=wE{2_^&)zmhe$p$xgLXVkOXVv?++Js5fQtAg_bXM>J_ z*a^cUbV{=Mn`P#B95Y_@ds-KLfF7>|^2#q6nJ|$>RctH_=078z3^YlhKFOBBc+4d^mo1=L5`Pm1$dtY*VM{&vrU?d%oVa^?JDoqWw z^pL6K?o*oHsa2Y`zh`PpQ*Q4gzQ}%t+OB){RW@ksBliv;+vV%od$Lii$o3mQ6@&BN zkb^Vdu-mfVXglM6&o8#Iu`B)TREhXWMG<=bG?k9YOP*UpZut!&ESn!Zi&qE0PTTx9 z>}}`VVI~K4Lq*R*KF^lQT||y7(Aot;yWmj<9Z!yNJnj`gDrAml3WM^~Vtt@q3iV3j z2p$k6$}21AjC{##Sj|ls_Q=1Y2^Bv?i+F!ZSdR~mqOa$`zs#YJwlCNl)PiR*dpS~@ z_C_z$o;*vi;MiacEWg3zC*k}k7&?ipNVr2%Wr$oOjWwz#o5YH1eButY?-@UPOBZ(r z$G(tQ7}+p2pC(qyHXK)};y&N(wm3a+%Y2gUW0_B4uzwXB?56NvR>*?2x_4Lde(jB9 zoV?{@#}l?`)4AHf;xZWcmw-3a&3uZSgDtZ*2Q-4!n&S;VX7>hv?C_5Hu6N9jWs2Ft zNpodE4@JY9aN&mA)iI9YaQ(~8*sO|{KzbW@MJS9_vx!0lyZx-2I3qFQx?L&S9$du( zC#!hiq)jPmV{b{U>u{6nS)xg`i|)|J*9wWYNUo$-d4rp&i4+G7E~mDsW0r5> zvi-FCDBBe}JX+ip_@vK$1U}n3LIUrYC^^9;Q4CsHK^}adS5$amiiYF{$GYI27KZb7 z_ne>*@jAlFws>jFi^X66rppJzFEcA%cfw|_Lc(_>~%X1c~fqem(~rf~0=7-efY zWjO^|DAYMx3yzBvSZ|Up zQG97p`aM)@(eEFU74I~w(V5qz-x8C4UZFoGUCz9q;R9wkdP`h5dJ7b;s47}Bk8KhG zA7*iZ)A8B;6x{qHGtxPiQEa*iB%B{d!dZ++XtJY8%7;l2MC{zDrjroVtOehW?-W#x zk#89chxxwR&vfJ z)eDiSD5za8)4M~do}Eo&J=LxTiyi71Mdy)4XknU=<5e>}TBVln%%T^; zdYMBny`o@l)ed*e6ZjThPWH1`3BqJUzJ9VX;d*!pGI4ng-7FByDhk$JPr;$0;Ogt^ z_;>a78#&*(yWQ^xzvn*f-d7CRCO*A;OW==}>VePsDgbTjyiY8>PYmyVoc1_x$pN7A z%#|p;&x{9?2um3cc2PWd0~c!>xL7-?6dg?vYi9I!1CIx9;PGH9Ld@gAtE$Zi@$>9x z*Lui=DBHNvkj~C4D2f<^UHUlR+uphJ3KD(&GH#QrN;0K-xkMqR&=n-hA$@PT(v-fv z{~hTohmGadM6z8;QK>D2YuO_}>N7N#96gjnFLrv#k<1qdy<}N0Tt=_4vSrc>9pI#w zEMkZ(ddlX}Rn^*Q+e=~AT*;hQ<7sx}`q8!V5+y$G8YhtyUhN{g#_UOO4QFQ_b$9RM zN{!xmry#8Tt}=KgPyo5^aP$NcYY&A-i|v7qK6fKq%Y$Y>$!|QPP2{Lob@#C&kW@PB z)|nZk6_0=ifNmTK6ry;rAd|wPc24wNDmzAR#Mo>*E$Nj~oR)JlYh!P)6O`J^w^g>V z9h$pUsixm5(9OL^ETr%G#Ly$02zx%%d-hT^&(1r$$Gt}vk5P^;Z{B{@vs+ar@~E}$ z51R8uV_V&@BTndh4ym42BzIAVXVJ+O-k$fOsh&O2#8SWExZ1a;vu3}hXglDDT!v(C z4RC9pO))Zu`}Tb1t*Q4aS}S4U^U#n{Aj}Iiy7xS!phe;_G|G>uqj!zqUwQi}T06_n z-Y8*hL@1)%7`}L9KI_&_`rvZ9QN-P>nm-_-6rK*QB*E|AiRaH$cL-8{J0zsL#mA0n zN@0E8Nj12vgJZyyb%&I~UG4^@a4(>lL{)bqa=q_v#7E!@Nh$2}VPg6*^r3K0PrEuY z#NAlc6VjBTmOv+R?9yRO>9ld2a*S-C<`Q>!8kC~ez#-%~?1NF}hcvZt)Dw>Js;3?} zAiTRIs?tv*0jp8st^r5YsCi%<7rjq|WDjiO31>uv-9WEpyx*ZB!+&ibt(fuGZ9c=Xg8Crv zCiuT6`iu$HB=||I06v~5=MT~Pay09DUiWHq&20^#*11R6+tVtxa$R8#?)S)5S%Vf= z6L22QD5F^PG~lIF!f9JnL%LI1=KsNp{k@v_5+W6`Dnjbcd+cTodV42}pBz zC#=zcFyzB!$V<7t5IGlfbD)=}o1D#=7;NU`2pwa9d!1;?fPx|;(~Wkm;ca<~7=g@9 zI7&3l=IOKd5~zi@uZ^dQ=0-1C$Se@3)t)|0LyabiAFSMJV=Tk6#SydkW)<3$ zGT&9Dte}o`&PEv{^V|CD-C*|BFrjXQBIfZC^6f=^jp}w(vsTY%kN%^kzUpejA$VZ8 zmu$y$QG<>ZM!D#Df6-=k)XxrdH3H(wJINYo+igQ-UDrW1IEpnvTiGseJFU+?sfw9( zv@%V6>+!qhDb=*dq}Ob#+G~`Gbdr)-jABkDZyEU`(I_>TxtbP5Uj^{73n&N8_O2I= zD$MK%n!Ks&47H4km*G3a+%1CV>d zV^tsj4Tj=%ebbLSKyJ)>Xw^V z@Ok}cUS56BlpmaKnJa=7jk0*uj5fG48+j0;Ui36q9sp`8qIp^#U8Ju;DG~-y9zPL5 zK%bFc7yNd#pg#ME>L!ZTi-f>a&F5f+7gptCqe%$!+3D$K4XQGAHw8B$7D>AqsJE<+b(2x(A#sy!~cP!N{eX5$ejr9c%$7?m3)9qz2*rx6x&1d(VR{Tdb&xt}K^903HON{K*ey9qr z%N0MD#X2`A@31i_MCifHoo0(LmykG~+Yvka;y~j}5D(8Xb7&36PHH37LWOncrl{tO zc8x~9&~Tg}On#;06gd*5X8LMMujlERCn9G0JJia8xbhq0@|pt-nZV6|F*a7Fc7x2q zNRV^Rt%ZI?Dp3vcA*VH}CUh2{6O9QcdQtCWL)*liDViGeV&@xB=!tt$^_(rvnLWoK zN9%L?_+<^I)W@?FHFWT7qh}I1hF3IhlRz+2q2DG#GgcAP30!IJCR&!6K`<_PxPeg0 zJ&F}vX8UG`EZtf_+3L9Zu~h3UJ|^dS`7l+imdR9H$0=5^+DO)5-dvX$KHOsQFF}gL&LC&&r_ZWGMNMA2#(I>GwEQu2ffCXxgcoyHiz{DO#+nTYTWT~*jFs>` z9MicQO`ZFUsdLwx3dQdlPm08}Kh|>RTB$k2)hwFqskWML>K(;+$27ARMYj-jU9TGx zOpz0K!{HY{4PG9V-9~wYWOtz6&bC7Zq5Hq3@h4H^#I#ThG_+DVE6gnp{;2gUNMaH4te^~X(YH-2?6n=D+ zZj7}Wvs3nqA9r0!13<$?$j1BGRzmhx@Bu;mBG4>_B9bxhoa&zNJP=+RhtQr1p`8$3 zPO5iSmy_^PydwChKq&VlpzO0yepwHF0il%bN z<;py>nx0L4X6jwiZzL`|x#<+NHnD*%bm(@!%f9HVo#!kCSswJ*JZ%v@u-&1G6EaDg zQ>eQ7J)~=_$+%tCjEQ!rbsp!0pVA8jmyJQ(#7#DzGG+T?mmqm@20KFfr)#(x{Dz;k z+1zdCRB`NTj^oxMEBZqvgl=**+?7E?~6rV&Yf_ zP+c2`%5I{9iG(SsO!2$29=ntBP8+|PP?6@%7kDKKrw z{C4J7N#q-)r;PG*M%4)-A}3Ryxqhj-^H)=dB(O^~CR`o(^c-cN$p~2zotv1Lb!Hxk z=jk)^L~84O4@jswmqK}l2Ehx*)AB%{cT&p3okfF4X482tjeOoBaNR9@oYS z8`*|w1-=j3$RI(!iHQhQ*L49&y)4MOs>@7tKN;>b#@2P&Neq&W6RZ@Xt)S~5NP@ca zClCr)Q zs_nL1MecnpB+ewQ#~HUeZyTQjl4-Wj;+)!G$ZmahH)U|t=`eR_YtfU@O)DZE(m@X2$Q{$&+ z*)~YdtD@Stf#}RVEXCiMppttd74M7hwVi`H7NL&oQ>o(yu04%-b$lhahlu^S0_B$? zL4g8WtL;$%{r(XY0aRxqK6@&B_87i3F?>;l9EY#Z!k46q8@85C1xxe2TRsrdx8IczW z4|{;$R6-}Q7SVk>U!~kZbCoA33|#P9Yc6>0b02dz5mjhah%bDF;ugN5ix~c(ZmoZr zSK-_zPNVg&`O)>SFT$VTxzpg&b%HD0PH&5Zge9@wu1s^kY5#iIFFyW1To2yXb@_}E z9%J8V#uZ+m#fWl^j=S{IV;RI`uem@G>Li6OM%UA5BSPS#Ufn3_jb86ZTP3Y?85-@T zwng1lb}sNSURnr|u7geVo_+L8r!UT0r!Qtv$IPP~VV%8Yox7N)%&4Di$baUiD|C3{ z>v=onG11jV>#zlJt~W2zjA>~eu{emwEc0<&*Eg*F_$u13iL_UR^7#T=?0(xOURL#V zD%Jb>VT(+@jhpW)_yaG~H$r)we!VkqzmM(r_3SATyGRyL$0*PjcYs zY$k7}qbL0M!>7K$8QTJF6u?^V7=TLs2bn`nOKD37}-Qo+7}gFquXTv^`BJ?89hvQ~Zs;tNl^vW%=f-SQ!_ zl)%@y80oxEOx&JZ0Ag-al^0tm7;CzhVz2UxM%Ie2Wql-4Lto@5HOKK(yl5g0qSa&FP+IW!cMp<{5%gcs{LM_s?_{kT_LY z6Ny`uHPY@!bG*P@s^WAkqw@sIoT@RA4iqd`MonMt)Mz_KED2LRmO|Tv)j%Wunw+!@ z$Ilb!VnvpCib^~|C7y7KZ==9w6fjQ`l!2f9p0MfI*Ia@|cK+N7PS1+9hqWuCWK^Op zcN#_ZxMyeFb5`t`pA%`!p^bo*TZsPrw;U?Q78>$5>7a<;H81HrMsKVvKP?ifJj7L+ zWy$lXxW`f&)z_bkzZ=#(PxLCk^xA!fo$1*h_{dgq4Qq=(zhlTA>qrMbFVYyPr2We_ zW!Xot#NogUI3Lm)JquD8J0DUQJ0DUQJ0H?uoex=i);fTpLkO)T8vY(1UUo#qoTmjt z>-^Jxi=M{h-oOXl>#|M%C@^O(XQ&5#(h6?DH*H>?WK38| zLq__UB&-)U)0nkf$Ofmo#%i8-G-b*=`0}y?no@Y$ONZPZBU0tsl`=)i9hSWj4*MM~ zO74sfWoDa_JGEPJ<1x3?sg%udDtELhGq)@5solD9PXTRhs+h?48fxxS*8b$&$@NO^ zv{ohePL!J6t(09z=w|Ly+yInKGf{k~xMz2x?*-tGon4TtXXxZ!&-<{Zc<5L4>{*zL z)=Z(+5JqazG_ysM(IPzFQ3O0KihFW5ro7*9tn`5r##o4%tvRZ=*XudqRi>PvFLvCk z6n@MP39lw2N68(jl$D^R!yb%w_BIoB2~gkGfeg2xx3|T5TY}!+RX~S$D~hb%eh}la z|9*eHp2NIz>OY6jIgC(6Rcv&g`G?uyvZ);y1XQS_p;MhEsGE;VpxGRkqS&}3?uX5t zT2HtvB)KzMIU;Lp%VyAUb0lc#9vX%(quPh5S}GV<^&Q2?UX1L;Xyd_(@o{8rf7xnf z39^G~Rg`6)(1aTaeGnxxQj^uJ=Aw$5n%ZB#$80y^Qg^RcHVeC6r|=3@aKOU*}Ez+qnR z&VrL$rHU*dSoL?JLbUuH1y03X;DpVn)I7swMI);7DKG9&`DM;tcQ0u?G^(O(G+wO)hXiRvKOz0ep z&+qthozKYs9lx%TJO^0*s{1{!=VPxj_48wjbJ)JCD8Tz6F~DgT1vD4A>^>v=MKUtI zw5xQ!YnyHpQ#*{M|9Y+rIQem{E&8Z4Vc+wobC@ z;Zj?@=1t?R^0X|G+=beM~=pz+Y z=CdyAw6t^7bEIO1dpnKX6rSL`=(#KSm7M%MlGBMIt;mjVXDQ)o!wWq)OYK$?Jvd7p z(KH7gISn*Ol_AaZ!NN<;cHA+nJIicB=aoDfcti<|;$BL<+__H>gn`|OQtqFBJul^y z@ha>cw-LIPA4DUO- zdmm4R7;VvwOf$|Ven#_j90bNIWa;Ye_jUS>gs45PIJE;Ebl|63X$sZCS2|!F{MlX$ zr{uRJv42Z0m0kC|U%6XjC*8Xe?z;?5Xkl>kXgA`n%A;g7t|TvVvf=m*IYAVUv5p3# zB^vALd0P|T@aEM+kuCU%-zXL}))e>z-8dQT#``{ZJLGg|l99PgH|EzkCmS+w)w^`} z0rFwucgK_d)Y_^2?a}tPqy6o%_IFeJ1+)DJVBfguPL{m-ehk6<5X)aiVG-36syw0x zw&-!<8{7yURBFBpChNQnAOEBHQC3|1s9zsw!D1N>QbC};PpMwcqlxtqE%;z2{gj2u z8oYTC6d5-AvIu=&bpK^^*Vq28yhQuXn|Dy%e2gwMad%H-a}MMbGVMS%oF%cuvq!1E z4tV(z+P~gySTYKJew_zL&H4^BRD1;^i z+69<1s-kTToDv~Bo98OIt=^h#72nsyt#l}z?)Z+5+n&HVyHA<8w`QAi_f%uL3_E**)(?U z;iJYa7ijFGJ!ektQ}-MUoW4L)ia%199*m4IcLl<|i6k9sOguj&raV6-M$b>ZPdgvT zrU@3=wctX>7`lzhp^aGx9os{ZL)xfM(=Pe+RM2m;k8#*y7o*U9Ct-1h9Df??_X>moidNsR%a<@ zM1q>H2la8$P&R9zy%^^1+6nw5t7gc20Zn5aZDFtyzn?%U4x8K2`5vW$oLE58kQc{( z6hv%^h7Wyodp!>T8gg4~-?$MS99e@qph?dh)lvxA0J)6D@QXPjZ8K&7lWOL2jx-b7~QOm zvMbeRFQUyAqh!2+W`{2_cdGEs&9~Tts$6#*O3f40Iw4p$%4D)V!PTQ^ zxghxb6+~ViYhj)46YeH+p}-rg&PqNZczI?b3pQ*LkDO zDzq^H^DJJ4%i(qRu@*Ya(L#qgLK>^%D?)VWh^`94V{^4@t;odzN-T0^QH|?N__Hy% zx%ri(4c)^wURiM^f29l5oZMa7qJ}=VVGQzB&lXK7>VU(-uT!JnyHEoiy;RIe8`BGT z?1X;xEHKBF)0?-S15JDC-vu=H_TCb`kLyCgJfCJwN@H5w$+DI7``fINuH?#MUI*=3 zU?t9GFZ~vtz`R+_-fXk!l{w}eUAYvb=998ytY+LV2I*H!UVMk{9C5evOVzv$e)i}% z<{huR7%DL)JWjTOt{XR0epld!!~S|J-6_>&-m6w>on6!OPKKYQ1iqPt^>sc>v;$JE z*5LpYfJ}B}S#({OBnqUULx&&MpKY}{#n3`N6Rmx;{$QOsa|sPCmzf)&o;B}M0y1KQ zuJ6R%_vnXE5O-0Z$bh4-mJvR2r%!y{C%)mMo9Xen4f=(aMlGgUo2W{j5iQ>(PRYCt&fjJ=1 zx5_GWjKH@Y-!i@(D)SHH)~@bptb9AKp7R3|oXjEND--!dd}o=(vhg}RntNZTjEYF# z^TvBwlQyP;nC*Ekd6nfi@EO0>>=ON64Rz7#8vLH{4fz}%{?d(n3o$ia63rb+wVb)T zHFVP9GYa?)L#IX;#@N8sXMM)^9ke|u3ktI9%2hso(S2i%k5(rF4LK#AH277 z_>iLfPTRr@@(y)PG5Ouk-lsdv%ze)Ma8$w)#Hyh7m*Z?WK6?w9`~tqu;`?w={tJ^Y zquZY_)ILwRvR$u<5Lb{uR;nN7D2m=nBi3Us&G1{@sNVJK@ zmXV-2VFu3N1Za(lmRedYMWuy?8Q`rbgh_zy@hDoq+p4$s_SRl&@wQb^6f%h<0R#yM z^5I87#TiB*fF=RL%zypXK9fw)_PzK2ygUz?bN1KSA8W6@*4pdCZ|Ov3EasVx%4cF=BPl93dQB9|F1D$;idBA7=crpvuB8*A48C zU#^^zguo)BsZ%ch>MpOaIjA1Ne9sPmgkoZ}N-@KQI!_^`LYFbSDuCUi7|>guh4B34HAzU3!s zfIh}*b7C{djUs~hRLDAsIgk;(XAWZ^k7?0^DV*RqkE_(xU$S>fIQO+IZ$f7IO5AF) zUY=Q1h;$s+ytza}^3ou2tx%b;L1U*Oz7a zC~$<7eemtHu9Id$314EmY{bG0pjq398=0lJky+|y$ruD<0Z8s(Xs^NDMlSX9SF=`e z|4MhDdr~RxocpT2{-MbW(d31YpoPjBxJ{baBIYl20I`>Rr6>C6nb;_`ICV$A@v<`N@%9rsQ=T5wm$@YP!R)s zN)VRX?$m#3A(X@YU&;MnnRxxIbkgbyh!o+4fofe{C)J(_zYDZl^_>7@_P#hZ{4Ggu zgA{_qc7j>V8abkaAPe9CUF!!_*InYH=1Q-$QU(=<3!~Um^(uD|FHbuP4~DXYxoBC1tp^LSTdVF z`8}BH@de$+-uq8=HLG715{`eGW1<}qnLmLDI~xlP<;kpAfW)OzEpOlRa&z%Qvqi?&kJIfj`hwG=N4pgPwJSejWkso9aTz~?wdoi1o)n( z^qZmHF-{AQ=Kfg{pOt3lO5U!zvW3!*&}6;9@srr+(od38#K!2SDUfBDLrPf{G#9p8VVpGG(Z>;*<#x-9_Z7OM7c~c? zZxOifr{%8*`96&_(s0}gf1Ss~tE$$$brQ#UJ9aF!QyYwZG9YBX(=*$OqO^CSbuuJ= zdlKxu<(Cz#Z&JLf@@h*xi|OBq(jRMY!fz%@eXWZoNPVr@@kb{1i^?Pg z1H`8fW`9snOH%sX4S>NcWW9_)JuBoi*rY%K+QZ>;U9>Wv{|&0I!P%LoAB+EvI{uxn zVethtod?7N6VGApCk&DY+Kdcy&zAfZgW%_++LO;NEFn?N7-EWe#!i%jBS2rZfzh6% z!9d;k8H>*G6eMp)Hgo0DuLO|iR7I*B7#3%4`2djKoGpHTtffnB>B?D68?tG&?hnpB zo|5>!$1J)`szRM5d};BDe&Zo_0`LUBZLG&^Xx_GrX^7u=mc6%l&w#gV=f}O^HC=dT zPH{WPyX_$F8fjdtIVWvO{bG-|m4k3edsxwplHDlTA|wMNq`@B35)WE*!e+P-Fr@X2 z2Ipy(_P02$(H0XsGKYvJwt`r|RC(i)*wb4YGrj;0ntEEsebjb-rgyP#Pw8cCx8Ix6 zmE98z&%6v<7`Mqgfc~9SY%i3UX*oM zrutAqaE-mh$hEwhb{%*UG}2SuBdfaV&lRvPTV<2jVHzb&4KZla+dOqy zyCSWTR?0!;LgJ{Ijv`AS7@BFBK^C8%Sv)geG0Ssl{DzzgoN{bSA5u1D2yf5~LHZx^ zHt2SV!hmMj{xkOJfRI9*B5yXFp{1KxFA^K35ZQO8nOYxa+QkUKhmhol6&TQF{x9}sNp4b(G7rmJ=EnHdltvTFgo_w;^) z`_xNM1&S2{yfU$1AlyL+vn}{2w-?4kws%P3)->r>v3% zvLu)b2Y6^rd;lkBk>B)+Himy&E^d)|w=-iJR|xZO+1xa-SCgjSFhZeLmAjqs9Tgdq zIJmQ|2wBb+Fg!LuFI4Lrp^kEpST&yB(j%HLsV<+(Q+Q-PP2u+WR{?UQD4?3~W}9!T z8l7wbR3>>5CAX@}zNfHVoJ;d2d7(gMZMTYyVe=+S@F3pTvti~Ra>JYX-=(E>qjaHi zf;DRcN@tKb3kDT$GaPRhSl|I_(>}*DgT-h~U}#y|$$ht7>X~qw#s{bTuHSnSwTT10 z21Xk*E#WzHBJfsXx^gC(<>v>9vIr{g^sUum&myx-g<=AxXr8hS3pG!-%olZUOi4>p z_Z=KQi&*>%>Mp3fOIwCLG^>?Kzw)IeTlR}izt|xX>^DHdv-@r(u3z6f*Hi+8zAUmR zWRc}oxx(u$jr9zz`yCHxkWAB5v0NHi0%25%1D1W|sd1U9RO^ZvjWs)?P2GMUvxRbU z)fG1)s9t^-tKP^hNRg11`{ii{*hM;#y{-r=jJiH6tmlzv`Bcr^h>RL zP=64%`{}$h>g@ki+CFhypS1ml<0QQ~BVl|AYWS3-hPfN~c5-C@_+)+b@tQBsiC6HR zI{v-?QM`h+Odqdh`uH@_$L~QOe=!k$c9#E_TRnn%40MauYb zk>8k7Y>poYOS>qH2c&$E^buPw zU`#HKHmQE!7LlxJ*1U-Y-=xiHRsZ_BR4Zs)AMYFs!+|cu>Py^xorB09s=cr=`7z>u z>Eetrw`lC#;`vw1T4mfjQeAzPtp)A(61jAZaTB!}y_cIz-&7LasEoa*xP}juTvrO z+RwUEY255PITUpSUiM+irc$7|*P>GT zUxL{V_#W`4h^)e}i2qzp$Sg;THl}oQKnV>gd6RLy@G(Uz&Ke{CDn|a97=-`TW7;TQ zFN$A-Ph2|u>vx1b(Z+OXn)vzLg$F0iEM7&JJpE~}Q(Q=1lw?~L)8!-Dyp?FT#sG6g z3Tt?%C)H^~PpY@I((mM+lQhttkU81OaRaqz_W*Sn&T@X;0J%VxyoYLsQgQlQooc7r zZBij*T6O9ZN}HbQpvL%l+7_$*Q0j9^0Ug z&A*W9O-8*<{im{DNRq60VWF85U4#^z0VNh);zYRlP3Uk; zO1bKTgyQL>yTlke!6;jV6<#qN?uDc4n9)u& zu@TllV`!z3zdYKgw4L_03Efd?cP$rm+|qW=O~57unvv8ZOPw#QG#tw(7;~08jO!~+ zSCKT>^}eHYYa+)lHbpn3D%nR@n!g7J#}8JrgX6M6be5de+KyJ4cjOQSps<>5Fq(3x z%XYJOyh_K7X8t}s+DHI5%Q49;es;21z8rBuZZtTu_LW_RV6Es5}PpK#Fo2htsXYM=p(3MCCgX31+gncsZslM>q4Iu%_&Zpl_%8sNXX%=u2xn zMM;{Kpsxq>RhstK&G8IW>o?KpDhdy)?8loZVlDb9%}_u=G(6=PO;3y`1=GVZ=R6#o zdRWi$?CF`cN)C2zJI~L9`0Jt}%uUEyvgT)R_WU%-DYfRO{a??|7WTAVyhVDF-Wpkj ziP^~0v)LZsBY&x8jvO9s%88xH@qVBQ*E%K9cFM0D*FzH zCd!v7$J)|-; z2X7X??o2vuQ2_@*1w3<2HWlEyx_bqn7}jS&Ye@5k}B2VQ{YyR7&}h(TS!@k$&IanzEBIEG2}LxuR6{!od8)|z)O$;8?qkev%t z>+P5H+FS!#J*bXwH!?nm%+7=pL8uJrj%7=)I~G5GVoB(s5^0g$lB3p#39N9Cg|F|| zBWhqf)!T82jLK1S@SpS{Khp;t0lQu2BSJZy58lRe?}IgiF#TqNaR4&`^>V5D*BCjJ z*qz5$Sx&Y7@Ak}b^JjLCtiu1Jy1EIS`WF67;Hh#gKN+B2E_X|$K-=E0&Kq=C69%juMm+J}a-69@%R@J|og zBZM=zjs7D9`kh7i>nH+_9@BA>I^i0ln~oyN-Z$&quYSxp>Z_d*J7=j&%Ack`;iui^ z?M{8>eyZC;`JVw*owjmQ9h7niDPPK>Iy^u4cB}P2MF{7E9gtxxO*}W$g3?+yAGjf! zJ!!9I3?1L^=pD~TuO@~XIy5Gp1*1$fV>+@c5pZV~WRx>=BgLax#u9_86F z7lBbuVqFhlI3Zq87Z$X73?4^fJ;!kT4-H_iaj*{Qm4mj$+>Nu&P2KbL>v=k}o;{iM zJo$C&$*!w^!VB8X3rczUkIkGK3toL0HnyXb;>gQcC0m9}oc6>dsi z4v5cSC(%koCf?(rnQ=sTB-~1GI^hj|s6d3J*kL{*u?LPtG{c|5fSn6rV913 zW@ppN=}?@S?s;CTh27;6E!s0seX^mVuwx~39Eo3Asv9>d|Q+_Y^r&|U=@OwJM_Gr7EB>{F_y5B#}s>k%a)~r&buURAwlsCcAgFSlJ zJ{&a8p!hNf`4?=?E&FQ(P8u-a{#2T}vw<&3(ew5j*^jE<^Fq)Z`D!TR+QFRYW*^R_ zN2J_uP#bg^f4Zq0d17kkFo)Vlo&-%18b_cO6eOSdg(x&&?= zp0DyA^4st9Og%>*$Xhk@laM$_MRx}b$0L;-NP|5b?wTO-pVO4X8XXKu;{;LtoC8Lu zA>|a}Txt-XKjN(YP1c!m#@Js}9ef#Mm&dag3(_%VBLD{Vx{1 z!kFTzOz6HnEN#_^UA_zrE~UY5#XKRNN!e;qiuIvk>Oi|k5w{PUWv#mG26%Qc1NJI) zb&GCRCKG5Q=a0?k?-aYwHzU;>Ua?5XvQFsCMZ ze>2nj!~zg1owviIi#?^A0GV-2LpxS=ZLhpuo~eYU)wxd1%qO(E1E2)71_U|xa6d+1 zUsmk0|2d;X2<{z({waQkFPM}#V#+MH7$uEtOD! zDYWeQTq{&}^$NF|HMPj%YxgIxk|nlqMM#`tH3`UR35PA?yMf;Mqh@rR zXw2uh2601!+=xDjw$ja!57}oB2l?Bh*1bu@cH-Kz>9pMCyl@FOp->*R+>;4g4{PWU zb#Q^x!u^AtEGDqX1nEkGIlqi9gU?46}BqdqYY=<;zTUx05!fW+S(HEK&`Ic zg7+DkXw%Jk3YdK99AiwzIYx;t-sz1<8co^NCu6|)u-mIBOss?(4H5RlqlbDxoj)0q zi46p|P1J;o5phVNQ=-AnNEZi-oxj64e0I?4k{ba!K{f=5#bBq_>grR_4-tDaIR1J0 z%*frDR*Oa#l-2 zd4Z0h?{dmgiE*CQ8Qoj-DOKZ>prbThB|7*J028w|Ii^4Ug`jv9CM_6kaL5ZPYQ@0- z>-W9K#D-dTW3IGOWWAq7^s$wGqx`9W;nWNV9pbKml9$xHo0to=vs{JXuQdk)09!z$ zzh9+3n5G2QDjN6CyO{wXq!G9Vtg>!2NeMO&|g9 z9yIqnP|9}6zgzNzgP`|v`veKtZ3Aps;)Gr-vQuIp3yU25zlam0xMhn&B9d<1w>e@m z3favvg;u-ntMpF9#v&A}SGWy{seZaC5)&qtb8;_ZwxyHM4l2^cSglj|POx2q?$3 zwo?J+RDh0mjE4^9qw-4}-MJa;e+wmKj$~Bo^m|q+kTd(g7Uxnqzq1#5Vwd!1cwAc_=zYQpc!w!v?ssoAA!)c0`! z?+S^d)YNgEs8@RZAS5+z^YerFIt^4zc)ResGG#!}!4^7DELc`jfkYzD<#~ z#GIaVKlv78@d9?0Iv)y;OE4AftnDcIH#$(FaHkTb6J@ZP_X9U{G^2%_L}yCbWjIst zr}{FPRl!*}RlY^%iK`5UN*Oa;q38^jI7InaaTW7nP;8wlr}7Y#sxn z%2d$2AMykCkb=Mz=4~Z3?Ed<=YSH-ZYTm>S`fXS92GUQ5n&)4ESe14JHeA60GL&QR zOF(RXXJ<{jEOS|Q!sq(&(uPdFt)&(x= z@-@Bjm_CFoFlb*;s2R7642dpjI5O;WxC@@fpOHWd1e>Je_gF?~cn5FdLBfOZD)YbAd1 zp{A}r0bO?33+c)}=?ly(3qsHpGCjkC(YMBwZp!9}RUOI@+Lf{u;(XQ zVMHiTf!Z+2J^DR~F-G-w+=l-<`J$P>6yC{x%ZMiVPB6OBt*wXYQJ|Fl7&w!|fp1~I zB4X<5&BV#+LEk&`9|{^ja!xiv*OXM%Zwj|p8s*ni(wjr1w9!PsiOt&RYR~7DhW{Gp z1p4FB=-}cYN|&>VddRrBko|J$=A2(Zmn2uShp%vIqsy+~uX?*RZ);~$4uL3>9Y(NF z`b{v)m*}z2a_!YV*XU}W!*u0p%63-zz^y+5Q2pfMj9x-`nr7Tg2t43Ol&7UvO`0R= z&>DA1vipYCZ7lu$i^$p_I-J0=?8#|cT7y%0U6gx|l>EWbdcjq>$k@e2;zfo`T0cP7P2oK1Kw zrQ~H&T+vgG@PAICS9BYhxmPo+s#q?DUqxi34&MM-zi?5T9 zF3p@X&L*GTlw3}afctK$M@jic@w4>9E+kedXJxsOK@K%f%$koTDY7#0_p@KI^_KTP zd>8!eCfWh`|1z1w`p)ycu<<|QB;S0@tc`X8u0?KyZmYSOr7zm;82~b{Ei|i`#eMLhS-vi%TF|}xFyE>h^ zT+yL=r?ywBMb+oK)oD|yi*4%kM%7!<0e>wVAeI_)CT}d=@7ppz;DsZpG52K8zurKN zQA^X>)uI_4>NID@e;FlkgVKN53~msvAm6t9mnl4>{--l=l4c-CGjMYLcrP5_+%h|r&iJeQ-;KW+<8R~f|77<6c>JR?5HO{{ zSm-itB?#E;+pSLC?Q0Xe)ym^vJN_x`p_ay9LF2!ocl@v4CC5LlqMZhbf%}Kiz$@G` zvEyHleDPiV@BeuKa?I28cAg2Z-aGJVQ!$?2k?-(rW_M~UvPOJdauQj=7xHe4rfj@}GZY%oqRbF$Z|eH}IJCpPvKo|J(7l{QO^z z_lH@x?)~W9G0`PsobxZ$#TnhWA+F_TF4o8NA?n17=R0i1t;M>ru*7uilC#mCBQG%E zi&RK+sNGWP#r_~hE)R;`L83W>N+4+0DM|#972#USo8r@LQuTu7uSCs8g+Zku#GyBpScuTB(i~J;g34P#Wn<#J zbe1>czIg7mCcHQWP4$QxiMbE>?mB=-xf9$_Bcbi|q&%pcB*7wHq2K-?l7Jb4?zPdRTVv;si0>P+{pX2Ye*|ImS zq{c6$KcP#}__b*KTAMj9r_X3Mk23SJGDAw6E;aH}k+sJ7k;c7+7z+G8827lUyiGwO zjQbDh8lC<2ZK^UI4_S7q((H2+#8dt1#IkjL1u8jqQMcO%gOSk#Dg;D)H~=Q z5sV$M%hC0Yr?|9t=^o|FbE*%8x(R+(*YTb7sF=;5>G;5V{Q!xZt zx^WFPkxNbFauZK*6HkEKFm5Vh*^95OW=8^1ruymEWUIq$hYFn7UDpsURlRV+>kWA- zRByFss_LEYnW1{`^vqMee_@%T>a}bvz0#7M%`z=Z*N~^EpF^J39C&Vqi()oUj;0*p zQPEURSVcUn`ezs_CKe>mr@w_XT4&NpPet${95RZk>W_qf&3Lhj(CWO9aRUM~!uB`wtx~#tZza=M>p#{HoJUZ%Pe<0`?KM!2f4_4s}0ySwy6$VbDd|k zwCJX!l$PGr&wvmEiCiG|=(TTc&vt3v6n}iErDmkw+5kU@Efb}e4RgRn+@XoYrqhtb z#KLnFoX*vEx{1|snNg0<7{c;`@D;jfYN>DxrnC+C!y3NvO5}?1PAU-@4Dh&=5@?#m zo*!m4O0yom=qASCOPqKa5I^OT*dozE59fX#@NiR5bVBJ$H5NL2+ali#iua<;gT;K} zGVXN}wA$mZ4wXF{g$@|!B`IgT6DIp*+X>>tdAwf9B9xCmfX}tq<#Y@yBR-~de@LYH zHlVa2{#)ubb(yD;zHbcd-y_|a=*&)Ofh9{;ujO=M)f1)kp0E;Ye50AaG+VDznq(j&e6 ztLmQEPFrm>Jxqajv(awNP-m&vUD#k3q0xnSYRRFg`j&|4Ee%laqcf=MxE_n=z&&?f z;@@o9{BY?e+Rmq-?;igNFR*`f31+&?2#t0c)uUZ{26>7W0{kIVCg}TIt!ri}%pC>r z97{d*BxWK6m~nprZ@Y)lQ)7Y~!-BhHUY|F4uNdXu0ay%*=TK89L;WO5dotH$@97&W zl6!TccB*6x;c?OklB*N1Sw33UZ**nqLyVJ;&PeAZsE^i?1G$3)sS5{FuZ{Z)B|P3W zm?dxVpA2Seg^=jT9Ar%ret%#AWr|=J;|bqr_2hbu!^`t%toxBkM)?i0KUcf5$D^VL zuzSXsl6#x*8b3BDyB`MzWsDNEA1B@&BsX-Hd$?QOY{d>GKx2Z#nC$c$m-uOm7`GHg z8`H)eL@|8iS683blosO_=)oHc2)MqWq=Ooq;d~Slr}fz3!mfSVp!bM|4k}-S#34O) zw6N<#ZO|7)SZh8iJ^qkx{J22#y+@Cy{l4RVb>eZqZx8+KN$RU~(OtSD*!89Q>WxK~ zZK}TWAnaGVcIe7(edkfXw-rvfcE-hgrx@?@i}7y1xG^6BTIg{}9Bf=eeBCGr&*{9= zV~N7>aDZhed}3UXO<$Mp=<3wq33hVYZ`|X!(R5rTYeC7TFzn{e1Vt=4RPrP2FNJvT zpm|>!Dh$#ZGfd0g${(P!H~RytklfWNnnTKGka$s9wY~sinQm?=0Y7tnc-C5vYRH7U z2q0AVKs7H{mtYRCmf{EqE9jBv_)YY{3KG;_U+o99kw8 z@V++gr^Q?1hDP(UZ~P&$c+x>a}e&_dNceQ1fA zH{D5ps-1;|BAjqN;S3toV2j^b!k97IsA$GQw{%2tqGl~YE@7vM`P7dh>PHdAaCQ7D z*^xqEgsbRNkYdxR(h?6i9kyg~Z|AM!Cpm&r3i-*Md7````9-OAYvJ8~^yN)cHSwM< zPWHo}J97K*=L0qft?#$+=P?U^rsIFj?ZuzrsdRAvj9nAa6hgU`_owQ{J%Yn&+|(he zoo?f%FX$)VxT%|d3XBWrZ(-J?GgN!Zmo3Ek4Hnd8$TaVpxKt1f2;MxY$UM*THh)9_vGrCW6~(yfaV z8ErN8v8+c^1@nhPE8x-F=%nmS?8l*SB=Ol`w84sE$c%6%YgYc69`P`wcA9(`Hv4wg zwYNp78WF zB~lF-7iUnVPkkVBD`f6eD|fe*`;p9@A#>;H#DPFP5{y!0DZ+R7f@c02)^qH_jn$AB zrg6W9y)65SHuj!WmsEDppApa&rLu(x&2Uin#ls_lrfYRCe<-}Tr;Kh?e96d34$iCA z4P$ZO9;4dh7QB`v=J?bkE3BBjI2SI@tblr~K`k10#my-!>on*RYU{a8%fNMZmFNkS zrkTnG3pyiNPUoM)!%Is)e$SY6h~0nSo@A2gswD*DfSn0tRir~>!;<-%K^w?H^sKL0 zt^0)om)6DqE%x}m9kZwhFDQIx5*ea{6q(LS}BT6#yl zd9QlQPW7tobjX}Kss4ETNn*TQOVy&i>a8CUMcen4Ci;qcRipWRg^Hf0qK&%J5sl^e z_D24QuSarK;~6^#GY|Tj!@ovkRGJ96k-V*lxoZ%{$oB{*6`>(R6I9%Z(93svrdFB7 z(m@sO)DePF7yIIO+p*c<+6Hga`Ry|lXYX%15+_n3t=znuQt1G7mjizKMtaof9mFRg z@VlM~3>EWxkLysPjW%|NXcX9cA$CHyHnTB%`)A*3z_M+Vi4I zd-#(u$+P^vSdlw%A-d7QUQ&WxdjTYbPTW>()u8!9hF$;QA?F6HxMk~znu zKjklj5z+{bc`%yq1GVmvv+NLAJ*nQ&dQ#0(qo)Sec!^VTz_+kNa-q6!yBZxMZwDWS zM`hi&QAV3VA2iX#(SXHvzju#c?C;vC?2NYC!?$7Y{oV@ed+zELPJ9*b?&AAQ^_kKV$M?$2s{Lf))HMjMK>LKj$rcD|UW7SLdQ?tLPL+sAqyVcwFska?e z-E*FEsMC{_{#?E~{e8-M&ZD}+&y}fp$jL)8)gdxq&hJZ5XZpwLZHLwAU#fX1nMWmY zCk3OM$R9c-Kq=uXzWSYNd}n9xck-&O)(K)Bw}pHJ!)o2j1R?}HPx=iRG$kB1ZP$moDD$uf!-1@6(2XqiQ7{k2wpGem0;mT# zjJDL^hKL3`C-zBBhZdADR4CofZLcTZTvgJB)vRTG^ z66ZIIC;r0{SS6^NDS4bpv@6L+O7Q1z4 z3gyUNd=Yva``7gwtFGeP9!Vq$EdQ8tRw@8tV*+qPBlQ)bPc;=H+C|Coe)?vZ6l`1S z=N+I)^3K=6nrftu??<`G2QB)Bm2C`8(GDIo!T@EF|LgMko3Iqc;a>WXElC*qGA)NB%h!t?dlF`Sw)=$z776IaIyml$Z=^iEC5mVKBbH&&H~hrGyoq$d={yGz=DBH0r{n+Lmm}hE zl+cvTpGm$9&bs2)ow7^*CCOmW)WTm_`aE1yo!t;86c+F5MqA@6xEQ=zw2ap|W3v1R z+bSXta31%`L}w=^FSuVrSwX(0b9cKklInsD7H)UiL}~(MIBz zo#Cu+;rUzqyy#;1Q3}+jHD(z7YJkYw4!=6NBWVwa6z1cl)4ij{R9s9G@l5|D7Ihw? zG!}J!h3~`q{oIoYjAQ4Cld-@VEQvv(Ri5(Wvy=ri$SNog34U&ok92 zYY2a7dAkHVe1y+F>c!7AV>ym5TA~}IKo2n}AP>9**{=AGPFhh}MvC+)|;2WmjO$z3&^a!KY-`QliBIxt6Ye(^}4)J6iKX28HhueoCrcOHAeQ6CbCd1au zPo+Tv9b?J6w)RpR%ik}eDNX)BGoJed#mD!IJ4=Y6W*Ai{e=xg(*qgjuGgib=O7E#X z#l-?t?9cc0D;A?RTWDPUE>6&IwZ6W{CXqYFm4)1)|F@;~l#O=d{UfNwC68sdNbN18 z_L6_4?fe@1;`>nS>pj2Q4kMgI$}V;<{GxP6v^!_o2BuWPjTzp+l{Qs)o+wF!O+7IUliFbi>FX_x(?pGvnbN9nO2wFDubg zISX&lXU3qX^Sa$;w=wm)^RR9X`N^78+8|Qdymls@9Lr~E;z=~4iH8gLXN4`uic7}B zjv(~o>|rkrzt(08Uj!56`e&TcO5$9QNoQ&nGJ(?0yh`B1%4>%45Rz9gU6n5*rUCjb~_E-T6$IJD`DF8`B1MMP?* z8EW;LkbxvLvFBxb{PameU`3Zl{V7&fBp5*Jd^G^x5>66N5YhJ7a}DQ%eQH!2-^x*o zXobe)zkgC4zD2!iOHDI9G^#~J;xry~%u?@fkG3o7RYdpR-Vn*Tw~T%_(f=KFblNOP zgUh{re^zhq`BSDhj`$qvO#)uti5R0|o9i0F-)4En?K`t-todzU|F1)hu`)($Cjae7 zCO;=W0{Iu=wxoqe#=E0sB0L((38VSMvO$4*oPujdm^ayZMb$MsYES=mfX%k>R_Igz z0MzRWo`+jEsaM4!+OKa2!tTnbaS{R#d)(^k8W;U9fKWwOuV^-|R#zXV1V`+U9V4Q& zZAAITK>2b*IDmf)X9JL4QLPhHqA}AZ)xi6<6Y6cP1~n|Ro9Q)X;2SbmhI45{A^Jb; z^lAdi!Nw09R`D1mHlhqYQ^DJ|pHT1Ej6C)Bn214zy}q99084k^%6x>TURB3kTcDzs z^7(aU9tr*Yon;ThesWhouzdA6%`qj@0D{kB3+qZmYwsL1=9ly3^`Z zo1xRt_TzCcqR|+7W@ww}bsvC;eg|Ae@~F zDjj+H-dOT+_Qs8sNDg5y9graY9R9HX>6&oPTgcfabKc72B;V9pR$!of)EbOXXuV@+ zXAwdQNoDjqJ?@3WO#KWcDGM*7fxW+skkPlG!5i%!sMg!$YA@9(l|6{IOvDc%sFoE@ zYEK!j77g%LB3@+PKuY_9P7k1PO0`#T>I&CHV2uIq-XLFb3Rwt@=6dl|I>02vU__W{ z`rO#x_5s(+O8mBCbi~f&3Dyh=T7(}_Ud!6i>KYy)^_!U3Dmy#m0=qm-k?+3yskJ`~53UYf(r<5p(YpAxl5<^ngY^ptVUJg9d6|jE6us=-fSO4!v z?K~}fo?yOhd=xB?XLn8$6Xt0TOw9Kv+5-=rqMW4%QqGvRlAkG~z}Dc&S$g1XcG}2> z_8gC6>47tSiP0qmwy++IE-AEyHEU{uGkK6~v=cj!qnjgxAQ0dG+>X-@6crQu;}y^@ z3kwlQTUk=ZT&%hW zcwSDW3HCg=d8D;=;?--3RZS^qTYoX=yZg~Bu@%etw+W5h$X_alI*1a#>YT6rOp&S_ z+!FP;r5Vr_6nkjGFDt}M5dHuC;LHV!!O|@V&U|PoSEZxzSqtkpwb2v8`ct~nk-66# zgd3ScwQegKe_HQKC0Znyzwt)`^O;?+EV1g*dM(C_i(VGdVxslLc3FDHkEryuT`(9M z_VE&W_I3eG;sh@}7QEo(P*=cWNF1&`XiKBR8?XZ^A{Wt9oS*XawKNi2A(JJ%Kl*kT zt#p|!;-qa?2Kqx?)5zBw<3Nps^J`%MoJ&uG`H4OjIghG#WI$MgJ>is7xoZ837uamC z-Btjm>1 z@U@v#p>s&@hj`1tnb?mdp|ws>Ugd~5H@ zZ{|zwfmroZNe7ibPURot?Y;psZVM0B9#}C5J9p)Bb|Jl#cbro*)^jm+^?EeF9=urm z`2<62dj?uf7Y5u&OqErZyMml0$T1mbv2AqFoH(1!fDs7sS|Wb}r46`S98-1I9yC40 zbd9jil<~qp!pY6Q#^ahi&-^~2@Y4?U(Z)rJ{-cfgI(vdnC(oA_ z(~S=H!Auho4r}VG&tg<{o5J7dY;uHM#DW4w|EoM7{oAFBlgSdwhztvwBR3$r6!41) zH-H=Slf$h3(PECCaaHA~&iwMn_SfUA{E+>{@M1*hF zuNWMZ!*h>c`X3|4(6GiqK>lvT&Lft zR>m09IYdAKkt~&4G~ed=>p4$1^8q*hfM^S-tG5}86+L;OF#>kM^0uwO*Q8c9X}-q! zrcv4L_jUPUE%1)7b^iWJ)8#a3dXo98z`a4-O_^V+mB)PX`EU4rDZe!=OozX+xe$f^E3=snFjJBt`_Q2H(Q9+)rj{>Fp5xBkqcj|9nm*UXB zMM*^cna+LhR_l@qM*^BItz$pMJYNt{PO_@6hC(#o1>vm-%GBW(d+h`iv>OAZJG5xZ zsV+OlyG^bC%qDHtV^Mj1KoAWd!7Q{krh8^k)pPFG#8x&}eTf~1O@GNfOI`5pEcGM$ zpWIH*@6$8=PwqAEaDVlnJO!IZpB!N;j^RLmwiKN{x_W4Cy z7d+R|qgwZ7{y|&JyA@)zt%L^i?wrz2`BtGm-aM#z(1&KFJpd=Qi|hG|F>TOs zTy(~IBL7HS$A-x?`#ckB{R#Nf9!?t-F*n&LdnyYN=cb4sN~B(;*$T4k{At#gjwoz;C`CWZ%7&uR^!fOxPEn&yTl0^^xM~u zp}id+|1n6Uy3tJ3VT->A4G}YcG!!X<(GBh((?p14RQChcV9X#9i8$2Norp04HJUvK z?Y$^ft!o?%3T_4J>ltg*f)<<9itUQOh{Aj)X2_t8-*6ANdhi(6TqA3?K&AGtAKQCV zXc|g5TFi;~lb9W9>&M)d)r>RK%*??SyUQ`Fo8#hByJUko9qRwF&+PGUTK%YC<4S7a zJX@xLNtg*`uU;ENn~Y&~BM-#ndrSf5bU*&h zX%>q(sDi=ZcRUPQC3zNdb0ANP9GFW48r;O%+js57s?*t(591EKwi&Ow@1$B6Ls!Pw zBA@BT>*%ohs@}acCa+X>ek%U*J&=aUP0@orH=4z8E#wNCE8lmcF=P5GUx=rtolK|c zsarg~s*9g`#M7;3_{k=|!DK;gtQ~&id?zArL-b#w-?a_j4=FLqLi<58|J9(zFq&Vu*`fKRkp zVd+57*DNbUUF-(-0Sq>H*KT}BGZvOa4=FI&2w111@aH)+V>RgI(lkfgjh@X}JhF6? zh-aTCZE+cnR%~4Og(gCIPD{oa?am=iW%4zt^x^_KgJOO0ZRyM*9#XWT{Ng+pmH!+R zEPc-nm3*SxL15bm+o+Gl&}6>SfZPJDr7q7yUC)uUH+bRFhM;d-WFWQCjlr1Zd77xp zE3$(Mh>T#D$e(ezD`Hw#R4NR5hZP)b4eCQ%89P;pSn`s-5mkx@AAZ>`r#=MVi$px8 zgV9(zICC{9V%>N6zI!#}cTZxsFs*If``>?Q>5=FeB|M_^h}hHD9?j22C3?m#nihUR z1k=OC%rF1tNs#OHNA6!$x+!{A2@6aspGVpAnV6eSr_VXBbTg0^ZQht>{Db?mGexbf zUP`U)Jj>l-!AgDS{g;*QkEWFHMWy>iN7nr|wco_@-e&aYcif-)BkDtl$H;wA>rP=_ zzP3Lf@tM(#fM@399^7rmj=&3+BI0s`yXHGe_b0y}G+lXsd7j5ld-Sdk=xoZXdm6^L zYM%e;?Rc4Py|m+Hj`h-km&N?zcv|XpY;;7LuxY+&waTm0wWoiJi$k|5n0Mh8JCOEnZxOmyy=X^LQz?US7sa zx%JY37i(o-#LB*Ct?Y|f*%z&qeGx1BqP1Wz(yFqhO5|b46^dx%uGVW?uqX5`SnLhw zuB?#72f~sCuC$KmzQ*vSga&x?aXevquCtyq$nv8MH%|nob^qXqgeh@0-%PYj9K#1i z%S2p4cIZZ-2lrKi>PD;?xkabmETd=hanl`gSOUEM(&q9a@S zt{H34Id%2bmI(f<@^@g~dX5%RInt;pEKNtdT|_#zlpYz>74aFB(~X)Ly@|YeDE(4n z8LsDyzdes0?Vw!s@kWkNH|T^~hd9P9b)MhS>o0$HCmwNoI{&Vp|5AS~@=N^w>`vW^ zGSn<}D+nQG#9SfzMfs5G-$Y~oZlG`MxY1~!3DEc1ZHZM$-l^X2WaZ;-ZZtCICvm7O z_Bf=7N3DN}*;qAbE+p!}?{U^|(p7&)Z6o9dvBS=_C>1?DKwZJs58u_zaesOSdKV*~ z)Ri-@BRBnVEx|lT=Aa_8z%sFEr<7q#7HS2yKEleo(n$Ve%=Pb^47x; zWoHX&q4o+vtwj}sm#c4}Qu4NN;SjC1`&Ukc9DVUHH**moCf1Ij=iC+a{Ev^NRcJ{( zXAcC4!+tuBQlCXC(Sb+bz(5d0FQ`7oG^Pj0BiQ@^X$rHA4lr>q)uQ-n;i-l*9FN#%+EVqLi{5M`b z(cJeH8S5yzqy&qX!<&@vm=U7%(tjmiOTZ(&IhnA=!z>|#!`wM=@!lFe<(QubPm7sv zB(BNfD}e)qj{gs#m(Ly-TATaqfDjSsM7hFN`6tx(#X@etU;ZrJ?pH?-gBzN2le}o2C{G2Bm9{&|Lij_ z4*HtU)D40p;q>eB4je=7o5vb=h!$^~=BxHl^-2(Qf{9exke!LEQxZa*dge$wL`T|( zrMM*7=H(-8opq$G!;!YmI?~qRNLyzeY3p#Lt+S4_bvV-2Sx4GB9BJ#UBW)dyv~|{z zwhl+yI_pSVM~4(0Y0Z43?Fe59$p!VOY(23W@?6_T{kfj|vs~86g%51F^rCYu);C%{ z;U3O9;U4Zg;bL^cwMIT-QKm>nKUQN$9MMk+?M!r4ne;)(>w~Jl*?=&`)8gm2MT7v( zxLAc@-rQ6giNJ`xNNq1|satkoe-3!(N$TDj*R)x_tqVL5Syz3vye9T&B7ysXU3Qzr zy*X+|QE6q|S4&g5)9<33%Y!4uAsPp5W|uzUZwE>n>Kim7^Qo#`|Jte>xat%~z?ewD z(lDqsjPJZ~&({`y6opw|srHN|zdys$dl&sedRy;jPG^dXnsWyLfGoxK`!>}K(1^sl zl)Xd_TWx-A^Vhsl4a+}4atJM5C#H$nvt?%H>0s9!UInut^J*;JejlJPYjBg%nFW=aTPyN0tF|Zrn|`rdo%D;FwhJslfD$gIsPl<6J=&N8 z&9>}>B)5)UNfgU=r4NT_V~5t97Z~fusdV5BQ!+G?2>jbdII(fLY=6f$FjvnZ9r-r6aa#E#$pSwV4*NQxt7TMY{)NQF+V8 z$x4gDROzBjB{wRq=~pQ?yOL8@`o-l`3C>`-5`kgO^u7uMvn#wO_hEw0wZtp^+I6VQ zex3QOBb&Zcm;FIj3VW#1Qd?iw=#2WhZq-C^lX(RJz%7}PXP3+xbEsNX^Am`gcYB00j3mv@{d8F=NG~UvvZOEJVgbLurIoyTN8rf>`Jc8L}{ZA3(CI zk5IK*>e*`N5Z7Z8H++;%6PI>#=@H$$_>C%bGV8;-*k{$)ytVh+tm!hdRrhVZZGR*!CgT-;`?DI6~E1>9=gDBy*$uXrdWa#OTw;<2}_ z%fv$V6H;Hm!u2-``R8$z_MVpEC0pP~g}OiYZGgfnC{bm+g7V^|9{YGemFXE(WtNW$ zMq7wUUp&e!HI8R&hOmhpJY=h4`bRmm7KbOt+MaHxB{_}RZguq$zsWi!?7QK7)D{D! zDX)^b&>R#p2du?CyzwSqFo?a-4=N%;?(Om5idTf zT~`Af(<(cHZZ|aGT{ki5!qRzNHn@=KOg@zt$7uCS(y7I?-;V0cD7 zb8%Ja=qdaBak@B_U_nDc0*8C%-|4m^4)2@<9Y+{E|#ngz~u$3jsI5BxzQf} zu08R@KOeNxn06bnS__347~h&6VEF!pqqft5x$?GrAThC5(zD3 zU$ed3n|OPnL~>AXWyJO{xHjLUaL8DvE~=f*r6Fel_2?Eiy*Na%Q-%b989sFvttirO zO93rjQD*VBH1{nY+glX%Gt1$9+VoHGPeD+;ql;ZZ@g+OAjjOyx12ZhxTFHR$CR?AF z*Pj0q?Bmn%)0^Zy(Y?0pT!)qWKIevi!e}dKyu{fw{qIsb6vmFl_o2l8@ND=h5XBy` zUwcF9Y9{m4OK2DS)mPhfHV_Y&BFyFyE26NInkUR~l)n9V13W_9HzU5DAv7?9A#^X} z27=p_^aZLJ8It(BO@4jBCW&EWU-$e#_O-+si77{7|2-@ zQ%3*R*pbZ-qyMMa7QV4`f9a7He?ifm%!3s$ZMgw2>+u->*;}}%jRlRzxvo)JLKv{1 z5Z(etU~I;uV&d<{5M@#G8qW-Cc*BqLc|5FKUa`y5=Xks7wV&b}j#mJG@G7&RB%d!m z!t*p^c~L$a#Z1Z=#he>2A!8r&wp1gKPUXjd0f|cj&&2z~-XJ1~Cm3My7d=}5~L}Q?`+wc?T% ziSRb2Mei>r?q(S;FI*X4)VIc1IL(;A&=vHx%%4Fx{SpS;VNf7=GiH}ki8@;o4b`<)fB%w)@M4_>wf6wm_^w2vj^gfFCyTKzc3})kJ?`Qg^bFAXj?F?T;#QHc;RBC3Ek4mA=V{UV zoE2)_&j&(RIWX-7hgyGS4x)Xhs*E?=8Dd_70xXr&X-zyiQp+Sj^%I3T(kOJyTNXL> zCHsdXi}IQ6Rv7hDgk?Q}ehkNM*2gM$alUQ)g4_%CBt7i>rsfdX_v z6IF%D^DO(Npb;p5W3@D#7SeFb8|*gfOEnxl)IT~{Dv3z_&s_uL?BGZcd(+!l&^MrW zhO5L;YKCULfJFcf52#s!rud)@b{j(3SNpvUrrx7P8yry6Nr7&NzcE;9sLnw{wdEcx zb(J_)CBBS&1LJyoz1=pN>P8!Sg1$h-eMIL5DgaNk(B<~8F4y7>ndRCwsBgKZ$>o|$ znOGyhky@`n+iLaMblP)TTN#+9wFI1Se3v-IDhL4&#Bu|PMb<>Xqu;d^da*&}onUPX zFa~Y8pNfqDrPDEM=KnYd_3rb)&s1A{99w%tpXOeGYY6)_V~X>2`d-?5+SjJ8ScPkV zGBw%^Uu*HE4c1aELk%%d`-hUeB2fBC@^W;n0v)p>=2NsKC%)oMyH$j1{FuM-5}#!C zN5VfsuO5375^J5%)y*YfqL6n_*BDxdt6fBwUG2WnEUTa`c!HK_k7oSHqbqbIPd`E2 zPg8&fufhC79DN;A6~AzhTqNM&K;0){Vr&*VgZA$MkYRC1^X{N^O6I`ktjeSNS~)BM zhd)&Pn+f2YnljOe4Ju+w4-8s*N~scEYW>5sDlR8aKCvxQ#nFjXf0dxH;uVEZ3ah9v zboC(P%{O>?3DM5x!?n3eeAc`C<{Zxg>NC0%c{2kBx}<#o1@j~n-1R0y!Ms%r1+Y}J zTKLSWJf^quxBDv3k(GYujFM``Ex zPrGL-3#dES!L*&4uc$i$8NFI}cP?A8hvx!lJV#w_KuJA&Akf1;Foia0QB(g%9JA1% ztWd&*`dw|eeb$#jJwJ@sxDN%idrsRmjR3S z9A7~#`RjN!rdjo&_&jbe1K5O9gl4wzH&+!Gqp!(PeIG<%BfYk9X)#o%-cjqy2t62o zYe=NiH26Wd3*{H%YDBxh>($A(5#6YC(^$V}y82kGcTF_04a@Sw*E7qKSe;_=>MdhZ z>BKe%4?1!wJvYkdbTK`@Dxa5B(DQ#eSS&Y<-tV}H#eSKUqItTB+D$y;U~Ye!E@m*;Q5P8 z@a>s@wSHGO)-t4Y>Hi;l?*iRawe^oCO-chqchCaCQ=nqhMvAlu$Ho@urU~o~37|Yg z#RDD`K~QU(07{Y8-2%&P6c75L-**)R zJ86=l{=Yl!7OEAk_C99DwPMf}79^Fc0LZNJ z;yh|T$gPzZOE|iEA<65JedA+mee7Gj3?Z)MBU&@CP44`R%g*0oht(=>vlGNvpc5Wp zMb%TBO6;8#+X!4|N*lS-6kV)XNgfQe$}djq=|Yk2amaWCsO(P?3;D0stIuuJT5y%I z5JVtR!R^9Q=r}8+;wl~Msf4%aMi->hEDF8}#`6+&0LxWN%s1RVW#tq6n_JPmr3*CZfP7-3SEOkV<>ib=E&snRnh02&2mIVJLaf5Zr8gq66q= zXJ8CFz}zB<@G#;`qQXKOY4{zo5~}AfM(^Y$lcx_qO1jC$mIiKgvj(YREw(=X>LJ+m zODmj3Um#vEG%x%iuEjgx<4t^(Ooxwu%j!@q=fk%9;$YW1Fy*6K=Z_Mu#G`n?9=1+q z--_%z1b=T2KPR5;Qwu=Vn1*_GV^- zJ>$$|n z{$}ZaX|3c|$ARYl?t6g9zJW=w>Ovz-9ng~Ug%*RrzC!MF$*{EYaw9g?~X z*Ac7n&OC!FXk@V92J%!qT7BvUB>FzI`o5Vsz^^1$;6UOELp5s#P}_hRK0tydG#nMS z!vwSHv$$1{)vb>5l0T+l>RW?RtQW^cK0pR}>;&&aKsZy~?1*;H$DC4hH0pF{WH37q$SGYUs0-*a!9fwDg9G#Aigj3>_S<_zz4Q~0 zu8Yd2O=>NlW?4x0|9JgX{SjyRpQ={JS(LMdsLxGzi4|u_kS5}t2@Kiev;zH(UZ3&H z_2cC8mW8y(-{&kzU?Osdy)X@DS+vUci65~K#<};8rPDevt6qto!u3V8)53q%Mjnks z!u{#~ZYX?~kLp+st9|>Wu-en$qi7IrwV$Onv<&(EgstXwWClj!X^?nz%bh0d`HKOJ}o6gY@43%{Vf@m~A}Yg=DqWrk?oQ@Ny0Vks)8QmENxusD?mEy;&ui4V)EP z9~{8@B-gumi?U#>mV?DX{`=kRoK*8u3PxJrr7PyK*r{1$#C!~olPjUo;W5yg_pBsopvyC%BITD=0&W&nLABp?r4;N^5ZYyr|ps6g&07Hxaz zsteqYd)QiF3q`h-uE<-+qR6W*n5xiisxfexLf5OtKo^N~)ROWE-G>D_C<`o>fCEGX z8$rOlLY$h%jzG<!gw~>GuEW6FJcAbKF??S2Y5d8S z6(XO@zsHqFKdSYQOUZp{MJ*|Hxi$qh;%Hxu`YtlMU{=;-#olk!k0=MQL~9C(3pxfP z*GLiOqceX)96KuPzN_J^WY-yK)m ziBLb@ofmU4G`+R)I~GY{JE5l$ZS zWP4b^?5Xs_eC{U`cvbdqQ(zI zEtv3i(C~TEv@O(d8boOOfJ7t!-u6~%dn0CKK5MyeQVL&W+DHT4Hs!E75YS=tJZ29Z zav~gZTp!QZg||UxPv3kCHs1)eRyi6f{GIoS7=1v{d3xR;{h2(JypAfCB(f>yPZF)OU9j1Jot`3 z5G4Gi*za>Ps}HyN-+?hWML2JxB5t<8=A9NmO!%wx5%cOJ)(bfi(JdOj{n~|e0%EXBJ zqC6VW`XW5+^&Iqa_w#Fdt#mWO>go&mQ(a;5OWi6=$UK=bX%^@*e;HwK5_H;;Hxe-h z5sX#a{zg2;px-YA2M+~mqcXkWmv%xfT_o_&QEd6 zxg7lj7oG>bJ2DzQ;Z5YJ7TRQB;DBAjMwO&e{e7;5`cvZT@4;JZ@!uhHb`Ra5zMz8? z(z8?5ZofxXS0KXzg^|(k5v@-uqCp$|eU;h>u;;jDh293eLOo3@-gfag^dWu_s<8!x zq)p;eU!|+`;NXoiwC&3Hw&8k_)pUo<5ef#)@I`xAigOnnd<>Y})m`GVjC_MD-;(@R zB617Q{u*QSB4~-U+jq4E8q?8ONbDven6nKM!ej9>L+IUIA%JKFF5RL84 zs0vKr<&BWH0e7LUo{YX#?2@alWD_)Me5TIb#2WR{>)0qSnq-4i?@i%m%-O{14Iw^e zVwBB0Ybx!K8_C@ozK-k~Uw;cJ6Zz9ddTV-m5^QkOgr%kl>rE332yhDnOsu4<75HiB zvmGBEkQM_|x75@H{^ardDm-(x@R1$>q>r2u#aejj>wF;aC3TsRzeDAqXP-MAmT(*Y zC$l}Mjb}lnc~bXAmHTXhzq%b|xLN1&hN-jj%y^gv2R#J58QVqb`L(a{X@L z4s$qC9iN9nGC~pqEhvIPCruGa?c`O5S-k2f#qPW7sH| zuaT-d&o)x^W;Kjf-C50}RcjXdxC;)t8;W+blTe83HExAW1<6XC-Rn9Xs1I9ce4!m9 zRev5Vo<>*%#|yAM78vniN?D#g)_bAyJmUGT>?V=hnBlhAn)vZmy@iw^MR;Ues}6@t z3u`I1@AuZzi?8za#Ph4(Jbh7pQ?eoS7~L%oKHD>SW!?5F?SoO*ByH;?W_jSNruP1? z?GoE2lB5#%^o%A2jeh5+gq&@<=(caE{Cg+GlP&GgD<;D_x8q_%I1?gUCqv{#hM0-a z4_Y0>Pp^jr9Sy)lxq*p-DHwJGDnphzE`}NLf_PZ1y#vYg8w7~|suOWmJZc$5;b#5h zd`nw!*(*3k3t&tCU0Gl=_$PaVcRDVHBgT`<@s(+^`**|reUM*%$*<6@sNHL9a&zf% z#49E};i}P;5K>+7iis{?RgVo8N1^PhFZlqvb}B1=T(N6M{*xq*x2I^@#DB;1QBg?& ztuYfXZe;d7j{7;Nq12v8!Omz)pa%6)Xk9s(SK_Nl6$XvNL4?uP!yce8q>2?e(XiVo z3`gz6xM-LRVQ5l4E`{Jaae}?UD?hlDGvAXP_VDyJ28|q&d0DG=-G5Bn$AJ1&DjKlU zgWsULjQsuRWs_lbYHU=3gD>lawVlzvdD&#(?z)lf%EyZrAQX0?atATB|AYE2yrlj& z0%}Jrd3}>O?&tyJoTUI>4;58+LaV>7euU1k8ATyH}f_ZKm@;*RLXkV zjs6}`WzbrP*cXr4fTje^g-UfR)rL-+!l(=sFLS8g@Od>o9BcXcf9o{Lbu92xXj2PO zr8|2hQl&GAcT=I2kf}CaUn@p?8vl^??Au7RXA06bXN>mD{5R2_iwt2al9-D+c7$I- z9GzKqHK#Kd#i+*ce+=`BPs42wJ3gVenRvm5ED82pml3dwe|?T4xNrtPhujv7nyNl%WAp5St;jEQ zF{mmD?UGGZNdT78rTRkR`X%)?o7$O44t127Nm=SB3zM?dQ8p&!5Y!C4p=sOxsrx;U zSy3KU^CjLOaSuB+q!GT(g9IYOk$_LFzKMI-H?swc@&z6J(I?I@!R8)pC=$B3hnR<{ z?!h)xnoY;AbW)!s|9M8GIdiT!Dp)W?s;K`EbxDE)`%4w;aLceY+D*`BJu;^)lH*gP zJGASb)7y)s+OgD(Vd`UpaVHe9$A%z@BD@Ku+30tmIt;Gznil2E6k+j7h@eHE@(F6S z38UAe77!Z9mJA*hv)^e$$20?ouu0N04 zC@47Uxf>+5QEJ-yni1h32KHCWHf5p$H!D*!RsW_8_M!SR5xxwEq--!s#x+9aH5lMr zKPs3$L<*)qDpjoEMMHOk)=lUPBVLJFEjwXmpTA#*j&BN1u!8p?zzPB77*KY?!ph!9 zq_-5w)ezVg+GL0s_}+M4W?SW&BPlZC5FqPEP>xuQvaTRH3v}(iO;Ubpm6~<~kGT{k za>stb=H1aCWNjAKZCN6$tJx!Tsa!rA8J;fVmp2GD^A1d4OG;2i3DTFt09ho&oBB{} zTx0ZKB|?!~GSKzvmh8AJA}p4rnegvZOKFH)H8@H_)tjyH7$ZxEsg;AXXpSp~;98K; zmj|9J{!E`*nirbgf}kl_Q{cbCpW&^%U0d=z3Z1)??#wUowo`Z3-udrjdy6)IbggmH z^DEEl(({9~G3sTNpu+{50fA6Ku&~K&j7=@Hi|AF39+V0SwXx5dqTbzv%Iitj?QyRD z`T+8m{%#=gLFxmLI$g#W-7(OdunoVi#H_l9H@z}-Ube^<>Wa8sdC?rzEMfLVhXy>a~yE-B# z+-)iToc9d>Db>5}dW&O)sNNoC=Czw+Rp-a5=8Bd=<-x=pSS{Xx`yEiNIlkJQXti

    V348crSpF*vZt0_;crt$zl{nym)Z_k^cZ0gFIXdgQ2{tkUWv~{{50PJY_u{=p6$QrZu@<9HL9v`{j2!UK4_on+Rrc(W zS>YbcY%>Zq*^mbSVONuQN=`XXp?MwUJSA~pNEOJr8FFqeFs6^S8-9?sMxpZurZ-&J8$-HTMRMHPx1CPh}IjQNOH?wKpVDtQx zZx<)1nspDJi=Jyb6u*8abJzS^y_q}a=Vvz0o1%p3;;9eO22!UqMR{{HPv)&M-y`#_ z(Hzs_4bz~_n`YgrG@XPJ=B+a=%kYaZENfMoPGmOE{{yOpo_7Obe3<1&Z1dV}oQz+MP?_OTag(>JBp zvJYx6bHB!<9*(9L-7i!{ZQMBxXv=AJMT4^P1FeBZQ)_kPpCw4gUj$Y|BS z+xLXZJ5ipjw<~jgtUc83dG=6_8a(N8AMf)2vM?|F)B~ivl1G9f^xjT}%yY98BNyvS z4IjA=6OaZpc~pnU`tWv&EFf=B(GOMQekUF!eR5y7L9uC*+w=Yq)Fu{~iEIoKU z#WxK#;i3b8KGN&*fKBv`gL+P3J%h*^;NL}Er_2_#3*+U9BDP(`Qd>U@kM3@3^u2hi zZcb$iCOlC&LA zjB6!uVjHabIqUoyi5Jo_CqrYPkZJ!hovgHko=zV+cAIGP8WZjLfwaw7Z6NJ#iBF+> zFb3dfwwg&iOh*BMkqusSHPnK3wb$W&uU{$rG$}!%Zd6mTr&jp%9A~&zdi`H7+B>2A zEo!PaFx?gN1}c+aF6DLmHz40PAt#S4IRKMr4_jGl-!wj;{S|pr{an)GucLod0)qz(7JBk+aVhcR z(EG?%3#o#I$4(>fuQkM%55C^gEA52oBH0i~Mprf9eR#qg-it&XiZ!IbUBJO^)DI-< z9m#Xc}|Ib@Iu>HGvof$|F8O^*V-ySf$n?{yMywd%lD_(dZX2L$rV9lT!Za@kkm4_ zs66Jmqq4u`nF74xax$C01Lm>KbY#WTTvDiz78=?e&_NX6##?&OZ+rt=9p(GPm9A zMn}?pA2m*taqyNUhpec)v@&Slh1VG>fvU|GSa=-@lfOilW&EP-Y4yF1Yr0Y9JG=ac zIP@5;zY-_iUFmC6$$Hw z6e{>u*fe{rns!>@;~YS?Pz6~Hijmsjt^v{$#U~zxA4`-6^UXy(?Q5Z?(ht6&UyWnk z{t}Cf*gF%H&AQ+QQeDiu{NR=#UB` z(F%8PDbgknx_nyTcdlnB{^+^|56$wCv@)CmpFi$Oegv&}lS|RLB0qs@&A88Jhc3Q!^|TFH~HK9nP9WIw@%M zj(t`#_t1?Qd$H5o@LOOl^_QOzJsmo!yQfOveG?Yv!fBH*jRIV!0NBb&B8e#JN%0n5 zclYJN`vJxWUZv6ig(N`st-BNI!@|ym|8TcSjGBh}d@nhLGy(jlyV0fq=m+*J-3|w^ zSfJ`5f-cIF|5xFQHX8jOz!5FHAcgwIAq@2qgkQiuZ@P;hj3)coZ7uV#m?Y>$;L*EL zscWqX#aJB3AKsNXojS3W_wPdZYStqJhp)mT?-pm!3&KTrkqffpJunE)|H?F=aWA>Z zFx>y{#6{KH?bjB%2l`uH>WSyunaH>RjEIup!!a9uk?ZbU8y0Vwra&tmk%yc(Wx;whcPAW0){q0T?n}`bMFdxco zsJQ7=fdhW#;h4B!_0JQ{c~RwZXqgw|ojensN&tNj0eUn(Bi@*p2+bo{`0EqJjOaAS z0o&66z0`EVQ@_*R!?i1fEeTM$#qntP%rgUDzYX!uTv^)#NgWobvIrD!-^0clv7< z4TCLp1JOCKwW0-%#gjG6S3pdkXIJGJWfdv321afm#&q>WA-*U?D|WTK7%$~jdDb?K zS8cOv+_%jUkgO8-+M~l@7Z^r_(g0Z1!|btbs__Imq#B0lhB<@^8s70hB86_TNy7aL zNHd1DVo_xdY-~VlTEr&PKW=*+btXtx(lISBP`WN*h-sHx!a)28-K8YxjuK!>6!h}v zD^m5vPK$3a@E|1wYk^<&#o3m{=g{7o4xEiU!++3-4$VPoaj;@MU=P2DG5moXTq*wD zmC<5jzEbRO^-YzGady@C5kOk{1e=K3#XbFv6QNSxfDl(bUp#Rw&^E)6tT~EcYmaR= zONj2Q3%fP3>15I~7Ka?bEiy!luYzv>i*e_R)T?=)5rp=Rr@Immpo?&=@^pU!kwK~F6gbDp+IoVty*T zYzoyJE-DguHW9^+DVaJaJj@+-d9NMz&7y7`+hc#7rNu7^ zvEz+)u*r^80>V{zkIi<5VfK0TGp;WzbjpugFrYc7ijG$DX93->pR>;$;@;?Pjr_@C zitV<-3#nwF!MuK;T?wrC_DWotCuk62T-NCck7*2 z_8)cD-Kc;}t748KfR$rT#glk-3hbH3!m|`HAIrpi{P9dN%0E`RM)@R-awL4eBIbc< zL3yWQvS{5Y#)uRKv_X_|-KC{CMH-oRiX`oYJ(9@AgRV48cd8J@Y=BSGiR>AdM=sKe zjYnrG<+8Y+Im2C}(XF|O_cbW-`w7xn^g>D@ljT(zsYq(qM7wB~Y#^9#`|<|NXylF?Vy>(fY+`xC{fK{&m-kYM%rM4^GEI=WkmW>ttN zTE(sGFxbiCX!nVy{o0#|Vp=i90k7ze&qzqO79xd96tm3m)7~yRF{c}e8AKl*3}<0A z0=R8)bhe;pT?qC{Zz4K77(VOmMJ&!RiN#roh-{zt68;-ct=MYWH4^sdYm@-`tT*nO z#e;ggeQv6|)m;;L87Ev#9a*d^fo0tYs0|SiV3rke{IjA9|E%c3KP%$+XH^{ktm?u) ztGe)yGZFvv5$Gq>UitbzLO(T%XNzy75_iVY0eA~nh?04_hrfs0JoT)&9zF^L6pU4V zQ}b){A4{rEeRA@DISOn8}w zO0SRGAnjcgk|C}TLmyX*1fxk_QROOmI^P*kgrl6MBYdPw`ix}1L8AFwK!q7J>vm2MH28R4x>*z{~x{Vim}vxaZrX{5T^ zcD1luf-US`biY3EqD46FJ0r8KAVz3bGlDq=FA(8vXIR;GOmGIhuQy>1c-cmth4u3` zroY~o6jH?fUA$i7Csn>DGO}MB)&OCD7pxZwSmW`17p&ps!Je@0G66{dwUKX^jfYbK zl401AvxTX+kzXNh0*eFQ=9&-~NtS8|)VB+|K>d0_7pPw>zzsa2@@Didfj~yShWY*U-_EhSq?r8m-1)0K{D%b+Ha~Og`{Bf}msYc=5dcFAyKuYfYGE+#2uu zVr#tbG$Z4EpJnaY_fJLN51U5}(D$#6hjErE#++=rn^!X)uh5J?iyqVdticY&R!5ZJ z;UwIw|C&#o#o!F&Id!svL_fjQ#Q1Yv@s7ba6V%KpMOTvH-33$oJV9x) zYT|B9?ZVS*CJ|zGQt!c0M!*+!3c$ZEo`W03^ZL>7bRXBm71z{V^ePu8q+za**N@N8 zGD1lnE6+xza@5g|4s>fZy{RMi(R-+IRC5VRiEJ!Dfm7O(NEM(&q54ZQ^-6UasY~U| z18mCI0EGjRk-AJWM(O|!^yB{x^ePNJx@g@h^YgMNwm1nMnMd4>L^$|k3zGOAiDxZk zQ;tLS6OipVWIGGlPQ%|p0MHT0et~bv?3D57q!S7_ODYKdR>*r&;$xOT!YCvI{7#F`f83qXLj)D;X1xyxY3%Qi#b~Im7g`Xdr!pFGC_KB7#)QQ*n zzG)ScHN(Bp>)se09=E4}Br-3x+fZnzqK%0jOoDyDt^xJxWcqz{zMLXwh6SMaYkarY z7&<^QuI>$L*}6{#^3QV=;Ls^&9`hyw`z!$4E`WXPJAl1j=3iyjQV|ECh#dmjjgYww z@0jCb>?XiBNY*-;AM|<-El!3!1URpMHzeF4pfS?kqsc1YZIlkMNyeSMntax}L+1Ns z&k?BZl$?3;)2{K|Ao1CDn`rOJ?`kjKky$STAx!z()^ufVSB#M^E?;4bx7V7`D}N(f z{v_SUbSAP06+?j^u%@~cD>_55ey-3J=VS-o^LGnp8p5&Vs!s>@llxi)LJk zV4PzGN!wL*I3->wdJ`Wy@0FL^Cdn}bSJSFf_Q=B3y6VHjR?3P&2x;sh?hot zHnSIM70)S*EmJ&u^4JR-G|!1V_F}!_X@<9u=83QugFqKN4aHSM(aev!BJzzu!!myd zR0|(wq(h<1{|&s|SPBe+ADu7drJrT~T@={L{KDTZ&>9kIE22B5qJZr;VqZYh*P=ky z%j9IYC@}J+@qy{TBFoJh@@j>ltq|Hsp&bxvq|jFo+6~CQMPiRV=tr}WZ)UR2Fc8eG zGuh0uX#5zN$@ZOXVT(sTCBAkXyX@Cxkna$Dfyq7d8~kzrzI+2;vX zUhF}y>XkP{J}|k=Y_khUso`C|n&7C@anKyaJW`DMr84aHPIpY@(PAL1aAPF9MRcp2 z`cZx$%Po5@@?)?@cKVM?O!<;;9uE8vMn)lWA8cD|=))e_x*awMLgzarKJ*j+MoONx zPRMF&E~uV!mA_XrYfxljS2KZ5+Jk;JP+G2JhD6KEyC&n?G2WD#0z{?F)z&Oro^{az zZ?yKL1!zlNpzpT=Uyk1ow|3J6gW7t~1dUwW?1f~(OiGru4Wd?>+xP+{Gl;}Ng`ywm zB)SKQf>Eu4C;7`T#`kUd2_QgQIsKAe*d2BQg4-Uv>v<+Ah3sz;0Y6qs!jR zpqyFzUDyrqR0mLv{7Zo0$vA?GNXVdD0GQG5KyhF2+Dt%Y9fZoZO8gdoBc%QujV7HE zzrsX!n{g{X#~UC`h{mRlrznKTY6+Qpk_60B*6Q>YBQy669Tr? z;{#ccCiR^OfuZjJfv^Awgfto#LU{rhG+F%{ResUjMPTM$38aZYatSHu%aCMootNxs zC+cJ?QYV1tPx32z15%0uQRT;tELUbE^Vq)%#g9ZwBLCuG{}eWsPCy2sIkzp^M~gF)PKBs(R{i~C!7w;9z7zQYKnktsHsj`*D++n( z?KT<_-lEVBxdE?`wQEEJ>UE^)6ju0NBYC*ZWzr|Kqvjj7Y=p{XpnwEy2ha{p!&6;d zL>1CSd-8eK9VTSH10sLp!OZP4?-1naCR#22jgYsAq&@k3sJja!4KhCm!w2bt1TlXN zq}xRNKt4~)Hc~EWvYc)Et~Os3ZT=G4{7F}XqxpRL9k&0=7EgEE{y~!o*(9{PG~1Tg zZ~*h||Gg$_ytaT3&HkS@y5Ju}xU0DZJniIZvt228w&XJ?Ef)*3%(1qctg#N zNQd%Gk!wlezoXcCMzi9YK%Z`!wNf zfKd3+KUs#5Lb|k_a?W?ok%Wf!Xyxpje{F(XwwVCU@0uXbcZvzZJ5g9&t6Do$Yo`ML z>1G;hy8;BgXEs9pB@6B}VhaGSHuGF&N0*0JLBAY6-bKG`7uz|=AKapXfTN_@2N z8;iF;(w)zPPf+?kUh%|>T5BP1L$8gMDVxQXKkyl~5MryNeSzk`SAd$O&vt_>iY?a$0RDcD|excNE1?Qu%VyFH$taZj{*g@+I_^$5)^< zikHZt0^Eo#k=Kr)=kA2_dVR6O#+G#u9d=$Z<~xm)+;Mr#k5^9QK8eLJ|KBNGLt!M` zjd8ZzaWeC-r}%1$Uqj*b6n+agY-6%rW~(QsK0U$t^yD(~8r8J_Q(+p>beQfwefnAC znMfAcboA+G@h*<0gXH$<*AQ&m24ew#jy^9%J7O}+*xw?v`wzB#3DJAtHH@#(ww>^L z6kboYHIftnBEN;#b_`t9j0phS2>{7ol32}Hho_!ipnUWW+uTBTYXk)taq&@~dr5rs z+b2nUbbYWR_E9XE#78~!1tI}=S5c7*!tK#gU|5z;2)LF38}pP3OcHQVeHG7Xe5Mq8 z4glK~QaoqywU6onN(T8XV$N(DeXUb~34_;Ug}!c3JSX$$Q44SNn&&7y*1KDQyGjAJ zt1t7T*{ghGm8%c)e@($smrXEO@{QA7$;^*um{R(2=0{x%Z~77DC&y2`UO#fd%QDt` zS^ato1U5rpGX{1*U5*gDqGJo7x27WAKS*{h7S<0+a0b!Nd(`-)b(-&=N8%v7qL$ z(@u{vdMv?Njv-^bLl4IIc!#+f^>eWFP`92rme7&CV>un;J66!qzGGE3o#U?(C-p1# z(_=ZEX%AY0%TZtG=rhMlR@NU0-(Zta-`dI?w*Jha^>;8wY5#QQnBE^1@cN%(gG&4F zXM?o<+t?tve~mE-P5$!~&$c-mdaK0r_?K{AV?5w|x_|`Q>x4l2$T}g`aTUftlFC*;Vn>nv8Q7oOc4$UHwq{JL z(2P%T*}6CC3ujm)qSC!g-lBi<8U|(NJuUHL`bB`^FK8L2t^f|?7vlp%UsOF|_Ck&7 z`5YFS>S@LmrFypF0*k4h-ME%i&q-Ky?v2&knExIUVa#^Ln7;@mlj(nFeu;bpZPyQ6 zK-mJFhmn+_9zxsDr#A+gEpC|VqyE0IBQ}$rL?m^+Wg#J}o5NM~ymg6qj&d%d=U9hW zO14!frf|J7lXV=xP}Xly8X>c3HSqU0iDlHn#^YLuY0EHbGekw$)LZX@?5r%z%1*#K zfqnL|4KvxyIy{~`iT<3TkgNuBK1{V_9E6#Fh?VV!AYhfL>scB6uZNubP5)4o^C;## z1Pd~2m6uK30DpiA%C^CCD?B&JtZWN3aa!bZwGDE;f*F59yrO3p^QR+m<=M`ve}E3| z&>7meBOT-wZQ#uqfPJ-(88JA+3|wD#SOjkFZ^qpE*Ta-{>`UU==Y}H);<&#sW2k}4 z9FTx(xt#gApgf`w{hXZH0w@hvJgoCFKnAVw1)>NE?1Cu#`wA9w)PJ0aRHp9noMjXD z0+zxgfEo7Sb2lbs8CwXYKp1dA8K9=Di2t~_5Ki5I+3NB8VZaY3;rlo61SC@ixTFkl zT-FKyals?1UrK!Fa!kJi(2D_d*>iZYxa!%&{Mi7nP+^*|5$#%k@hxc%X%CNDyqdP8 zr$2@*X{-&mq=fCL^Oj5QqnuQ-ZUj;eO}AStwCAFZm5)qjQBh#jp_e*HeX{O$Bm{kV z5S99&hV4tGs7Rb1oSXAK?U1_m}i-Vrmh zmeP5+sRoyzZ}p9{hpvu8G5VsCg8kzZK!mZ9Y#wyi=;y50B;E6jh7IEqOL4-C{{1oyQBtI(s^vN%^kOV^%ToJ|l(Z=dP_uHZW?>CaO32d8pS$ z^+vAxAte&uKNa7VH{iRNKarLZ3EzJuz8`v_tKE?%@x6zBp~5$-rpLLSxANpE@f)an zjdr;;KHC2|0!MoTRHl-GI*#^lM$mYa;l9XELd35{#80{+el-H2hwh!jua6Le7@+~#3n#)aoAFnp#qMx1?)W_&@`VHD$AQ+aa_%*weoKhX=gKh*CuA{x;Ydf`Oi!bS zF_fmy$?!BYxk^MNReMt7o#9Dl{0*XHj4CmsuCR*1%rPc9jKVa)0Id3cRDd{_EC?#} zOk@noy$iS!6o}|Q&$F^>B(Gq%qbneWKuM8lRsx1~BaO`mYrE&v9k+_M-3iag-^HZ< zs)3TNd!;*>13!N%K7S%U-}VupcwBq!_520VaFq!rWp(IicP0}uJ8O|(Ef)* z)c(P1y4(NSaOiG3nwm^<(2YO;PG|XjrQAYjGTvh$K`jU39_H= zFU*}-#{A!>&~tS0rvDn0oRvRjFE0NHnvJMz^#$0ulEMSNPuSn#Sg7?|C zt#RRwl16<)iM#$TlloDsHCMGzew<~z2Dh>n#dR>oRn@Wk+PIUCw)aj1-TcP8v zOFKoM2>_Cj^*r_T3bUtVlhSn5dJ;0(nt+J%#~@Q|X-s7L%*^zHzJ|DG-yrtEa-8Up zm8j3AL)Iu{O=~*u-whdeOKS zw5XGEhCh0`7azx$<$w8_`+L@yO@s_4Si$d)==yc@i27bt-%(-x4mqLFl~! z$@A0C$R_Cg4TwauO%EA-Rw|$6Ad9hj*iJ{>KvtAMb(h{i+rn6jAj0nvuaBCqlf`Sy ze4XHe{K9{AqRnRD;C-+Nx}Ip@AM>`|0jKIdJI~0# zbA%Ts;XRhO#$cxKWTbOchjZ9KSAJmrL=90~Zxy`)bwg_T{F&?sT8wdSix)?do&pyxDN!8V{nXu7!8x1-!Md?oFpU zZ7qwBJmTVNz5ASzd*l&~2S;JnB_=QOnCr?I_tp5`@Rhq=SE}CovB1}=aQ6yb$MGta zf*5xLC)RV0-CbzBAKQI}PS(5CuG7pcbPdgQ&sPx-w9Eda`@A2iB0PqJPF~Rb5{}Q`um>vnoUc~qsa9*?`G5DNlKxmp|5A9q zT_x`gNWL7&KLb`rqA16=VvqaEIJKFgoMS6u^IXef^ruYnTqjKLlrevwQPsMcE{{t! zQt$AnoC@j(PV_!J4i2AiU@(-g)P9xRUpki0Bn)Mz&F9~Udn+4Hls{L7f?sq%HO%)% z=osmr>Nx59{Tsdf5c9(hd|@RQrycC%`gi$iO6#?+a+YuyPK?c)9UTcMq?7M;=JYK) zx3JlEA3k7+u$;~Ywb7nGqdNR?&Bv-GTIFo6Kjl<|h}}nVaVpZ)-}vEBXX966mJLn! z^{j;%eDn4A2kAa*eDroT@LjhPo3h5|ZI37I6S9*I2~8v&6PiZC&Eue1qFRtIT{iy@Q!M(` z+A-g-yr^EH4Xef#s#f7Fb?Z+XBnWMq6NcdBhf2 zUbfo;%S(stbjr&t+czmMdhPJ#1-~2RWsYsIyxe3PEHCqHgXLv`ZLqwQ*#^r?rERdh zRN4M{dC6^j-f;?_52{PYBC$I@tUJq^$Z_a$Wopv5?9<5Jzz&de%_j%wzHePeT{?DYqBRvm!qhpAS=Q8fjs@1#GDnRy^$7<@ zTB$qvt^#YS{+gv8M&M?BoXS#yo=}{yOqmpW@}) z%^KBd_NOCEPjOr}I?L%}0z z=StLpbT`_rLWEm(x!s9ssqpywPWKIu6-D;(6_k9MFNT@>7r9^EReNGj6ieRpL#`Pg z<++x7^IVHRQPCZ0km9d@KToCRu75;7;rQfvdQJ}mt-r8)QoqaH#6s_~xbKhW!Zp#k z&7EBdIFxPM9)vAzNk|OO`OQ3o}V2S&|__Gf~+JWl3b4h(;nI zFT!NW7Dh(KnB~8xzTWqH`@g^UJO0P<%sg{H_jz6CeO~8%A9Hx-cpfc!5xn9oa>w%i zV1v)q0?z)Ki#B#*-)=zTPN6PXEURuUOluL@pN59|2hE5@t*NT+{5(objhL}ATI|JU zOw^56yg;WU$zz%i$1tKrDtYTLrYI)wS2B)&326=Y#LBJ3K!wqntBg86}*yj zK=zqYNC3jI!|@{8;yvyNddf*mZ!WU`M&g6vYT@34?$v73D+xodV>%`a-soT_u6|K-oN}Yma6a_bKw>14&?5EvK7zfwc2>H`|4w#DU4M6CDwCeMxXi9WV&AX= zEQoGH3uXK?{kom8*K z&-X`reyCjd)crP*SLt0O;eP2!ELX|3i-gg3{jL{-r>rjpz{`&jzET684do?=npEwA z4N7(^Z7&UCB0em-6kgD8<$<%qyGiQ|k0f*r?-}7qf9w@j3|#;}&)9XiHB^7&%E|RA zwUtwW&4n(3Op9|yNbx!TMJc04#{2Ic4!PhhGwaveG$rt5`1!@_zG|Y=;KsKi-QM3m zpLV3GyfkQgw|)T;!+I($qT?36SoK(V&dn=(BI2XZlPRQBIauiC=FokPw`L3|4g2>p^#cbi3SE(# zb1Lt39Z;9{6hRf~y2+}hoDWefhwilL4Bm)GOs!s6rkn00;bJA?Gh zuce+lw0dLaWZ~4?fXL5IA!^_Pw#~YWm>kE#FT+o~to4*N$a^y8G5hihKR)JbuU+r8 zd6RpjNy1g@U=l_u=It@xb`7;K<7VSxanxZO&xJ1rIgbl=@VX5O80Bbf8Mg|u6bt&i zQu}bHxs#;K06id(CyGbTt|8eao;&xAEqKQ8qI|Z&xL*q$Qy=oCZv%awDWO>g8+D@#6OJWZxEQe^V$9L&k^lHv#Um9@!-{<^xI^cqvz2`W1_&wlF2+S=Eca}9 z{9H17q;+Y;=HRPO9efX;AFIIBKDw-|WX^AG{i-@gmgz3OABi+zTr{lJX}7i<*q1PZ zkoxo%TobsN^}H*;%BGWOc<#yShPo%-2L$3YABhwkwu>Z;D(Dt3NGE(=J-%2NKN{q7 zd~w=n(IHFpT}>U#PvXkm2@5(i85K&D)|fJC3{rS_$MN*M+2IrTc=)EA&yiH^vgT)2 z{oR%OZ(_Iaess;5Psb>D+oa5leqq<&H0oq?5j^9y16x_HL`k_N^Ww^pOq!V zXktUj+bbx1F*}bh4QPm}+pV%r+R?c(TAtgzGkqMXjSeG>K2C44by`eHE%7^*wKJ^) zl3qAG`Eh@m&L5|QTi&0YjWd}~I^&%BzT|$Vjglf_;)7=0#6Iv}T-ikTYvN>G(tf3A z1s@l_+E$@09zn|1JBMGKV0w4KD)q#ui#G0M{DZnq(t>k_+sxd_3&i3p-QaO8A5U8( zhZ_lXNkZFYByyi+t+jOATfewvC`pqt(Qzg{mnCO=J9namG1`zyE0_>X?AHE>JW1-y zjvVVd>#7gu598ZhQRA)~c5rhv0dMr$ib#1^b}NgkIcn10Tvnu6xgy-_wF^=E);E=H zict$wV|e?qHGV3gTXZBM6he3C2*it_Z{GcgjU6d#SQyiz^pV$oMLiLZpATDYiCmkQ zhy8k#;zw7U=U03O3xkHPVd8X&2k45G(H+^?ufmiQbVW1|!IV8#L^c42TsOg`00qB| zOq|vwqb^vOYN!wsmloY|AM3A5)1|@@LV5(&1*<=vUp=eK#7$g=-ot+Nrr6OHJ0Qpt z?6Ik{{7hWl<(5vE4o{XDdu)LmH%T}ok)_Wb+vTUk#ECVGP7!1TSz2^OqbO)D7Oa@X zHCI@qNU|nfQH~FOk8Rb4r2rywYw|#Ln07Ra6i&oV5wgg=p8m0kirY9 zfgyTR^f@}Gy@!Pzd>+ptSrNyn@OFqTsOupbDCtdJ+xIY?bv4&nq;=$1fG_W`1$%6_ zpEwh@YU5~G^O3{V_Bq8;xZtvLPKzbcA~;9An1Eof0aMX0cA=g5ZHDi zvGp8XaXD%p)CxrrnH+9m@S{PbqZA%MNo2@?JyuKRp90<(;&_810@UUC2(0EqmIFkU zY1=u5W~Z}AnGKGh2wV&~z)=tb8r~3L-*wL8kY-6Su|x(x3?Qq>MpJ}C(lx0pl12jz z0(oG++`z4A9@0j08UCs!3pxo|0RDuX!<-StMp5)N*APki4Nj zm&4nN%GOzwYpZOK*&(-veT^fwE+8Yx(B#ZST|i$L16p+(e88aiSgODrmpM8M((D0! z?n+<{9-0nav4j@}Bp)Xa0}o0txS2S~Xe^wKbzwz=aEByofbGhNcR6ZfZm~#RL@0=% zL=)lg4hJ1%Yk(PDh|n(J5QYF}CWdonA_k1qlH3a>SPA`hD)s@^Uyc^UnTqvC*^yu> z>T#xGJt#1f%mn-dF>x%?U2^4j)*zs61E?He4Fyzr<$zrzC{U7ofDVzmlC&$=&ChV4U_E|kj`1J@;h7=RG z9KHHoY_Q;jTm}X8*QE)9#Sp@2T_2IfSwa-SAumH7m^x||IEX7EnMFEJ%$r1BX!2zF zSf6j=rFg%32B{lrs>}$*$D;QwM2I2tw3RNQPs(g<(8{1Gz;e&?u_e+m(0xqSrKzgu6q-+y6k4}c z?$h>BqpNFEC`qf>>K1p4bXvg6rjTo~^Fm@UT{FfPfV&n8+h-PGluk?ByU=na7N%gv zxP=JI(`e97RCo~6eU2165mhdYv@dQx? zjD9+;v9U>xHCrC@BIar=OeK(E zF^hdp#mkAe)oVU&Y0|ygA%QtY(|vioLT75(mcLlby4>ZoUrji!d`nBOM{`}u5?d*v zIDav?==j2rJS=N_gohr|Z|^&;{qHNT$%M&-5OT68vDyk|`B>PI8?`smE=PD37NeS3ROVa2|0Uk32H- zjmk~S9lI61NXb+~oMD-Pph29WvVpWgrh%h@qv3$T;T)%&!5lryH=B%+n)aHe-4oG z?I8q0w+CUJ;tq$yGt+N-!tXqJg0ZyedpTXbF38l2f^Lp~7*K-r z?ZBV9rMKsB*<)u^7%AmF)!53!M7_1FRl&_IMfHrfPJqeEgD+pGZC^^Q_cI(EPCM4- zx8ajh56f$4D6TrMzD#x-cl$Q|@LRvJj?R=lP9nG8^pVN!p>ycnB~H&yT$L`c{m|2+ zl6erNA3J2w@6*#$X_E?lR9vE}3Rf;dsAm^fR~MF-x`H2m+t{o(RVyecLYzT3gd7Y{ zJN?uHJkV0UqC!5z@Ig=Nu)SpVDNA-i5p)l-P~!IK-qbuP-6#3+D5c{L=BW<(swGOD zrfwmsPN!|9Z=FWy)aN{NHC|z~svB0S7Qw}=7R7I;cBh`bTi)+wZ(Ag>$rL?VEPwDx zsjK}sS-}lS;RzT|Hgts+&l+iV6?YGREZhaem1&ClPwON-&lL*t8y36Nvl-&!{3NnNz^ zrqDYTf?Cndpu@Y9E@wO#cUnHaadYHZg(=%5Tqp@+CyZjNJR@B`p7$U>@0D<7R=N_@ z!?FuuwO&~i}|q}lc1`8Vj_JyU5DMCyrlYab$Vws zRkDLO&tr(KY(7(R`$B4V%wyuh+ZpJsr38k(-(3Vcs(ksIM)YWA??k2`;QyKTw4}X$ zv)1Z-Qlu6bPMWkEbM_W-M#{@O8wSM1s4d@%Hec-q8_fmzeeJKfASXnGZKeI!gcQN zya9_p&GIYy`qt)rHWxP}g~S7q{S(dMQTrdz|2-4V-1@O`n9y#l`Obu6#a|hG=pi}e z)pA27mv|u(KSALALDaUmzfk{u=D&*0$-H`k|7T{7!GBGzAvNT9cAOjHhvb7u{VlnI z@!x>I&;RQh@-q@pQBC0gzoPugmJ{}8sX6P#kBu`-ZK%M%tscL_aaNDNaLzw)|EE1T tJ%48W`=m$&$p2K%e@AdumLD63W9bjXk23J`aZYRmf9F8lK5z;G`5(Cv2h9Kg literal 0 HcmV?d00001 diff --git a/library/src/androidTest/java/com/tom_roush/pdfbox/encryption/TestPublicKeyEncryption.java b/library/src/androidTest/java/com/tom_roush/pdfbox/encryption/TestPublicKeyEncryption.java index d129558c2..6677d7172 100644 --- a/library/src/androidTest/java/com/tom_roush/pdfbox/encryption/TestPublicKeyEncryption.java +++ b/library/src/androidTest/java/com/tom_roush/pdfbox/encryption/TestPublicKeyEncryption.java @@ -46,6 +46,7 @@ import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; /** @@ -107,11 +108,9 @@ public TestPublicKeyEncryption() @Before public void setUp() throws Exception { - if (Cipher.getMaxAllowedKeyLength("AES") != Integer.MAX_VALUE) - { - // we need strong encryption for these tests - fail("JCE unlimited strength jurisdiction policy files are not installed"); - } + // we need strong encryption for these tests + assertEquals("JCE unlimited strength jurisdiction policy files are not installed", + Integer.MAX_VALUE, Cipher.getMaxAllowedKeyLength("AES")); testContext = InstrumentationRegistry.getInstrumentation().getContext(); PDFBoxResourceLoader.init(testContext); @@ -176,12 +175,10 @@ public void testProtectionError() throws Exception policy.setEncryptionKeyLength(keyLength); document.protect(policy); - PDDocument encryptedDoc = null; + File file = save("testProtectionError"); try { - File file = save("testProtectionError"); - encryptedDoc = reload(file, password2, getKeyStore(keyStore2)); - Assert.assertTrue(encryptedDoc.isEncrypted()); + reload(file, password2, getKeyStore(keyStore2)); fail("No exception when using an incorrect decryption key"); } catch (IOException ex) @@ -190,13 +187,6 @@ public void testProtectionError() throws Exception Assert.assertTrue("not the expected exception: " + msg, msg.contains("serial-#: rid 2 vs. cert 3")); } - finally - { - if (encryptedDoc != null) - { - encryptedDoc.close(); - } - } } diff --git a/library/src/androidTest/java/com/tom_roush/pdfbox/encryption/TestSymmetricKeyEncryption.java b/library/src/androidTest/java/com/tom_roush/pdfbox/encryption/TestSymmetricKeyEncryption.java index 5b7efd518..e4cb5c9fc 100644 --- a/library/src/androidTest/java/com/tom_roush/pdfbox/encryption/TestSymmetricKeyEncryption.java +++ b/library/src/androidTest/java/com/tom_roush/pdfbox/encryption/TestSymmetricKeyEncryption.java @@ -40,6 +40,7 @@ import com.tom_roush.pdfbox.cos.COSName; import com.tom_roush.pdfbox.io.IOUtils; import com.tom_roush.pdfbox.pdmodel.PDDocument; +import com.tom_roush.pdfbox.text.PDFTextStripper; import com.tom_roush.pdfbox.pdmodel.PDDocumentCatalog; import com.tom_roush.pdfbox.pdmodel.PDDocumentNameDictionary; import com.tom_roush.pdfbox.pdmodel.PDEmbeddedFilesNameTreeNode; @@ -47,6 +48,7 @@ import com.tom_roush.pdfbox.pdmodel.common.filespecification.PDComplexFileSpecification; import com.tom_roush.pdfbox.pdmodel.common.filespecification.PDEmbeddedFile; import com.tom_roush.pdfbox.pdmodel.encryption.AccessPermission; +import com.tom_roush.pdfbox.pdmodel.encryption.InvalidPasswordException; import com.tom_roush.pdfbox.pdmodel.encryption.PDEncryption; import com.tom_roush.pdfbox.pdmodel.encryption.StandardProtectionPolicy; import com.tom_roush.pdfbox.pdmodel.encryption.StandardSecurityHandler; @@ -59,6 +61,7 @@ import org.junit.Test; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.junit.Assume.assumeTrue; @@ -96,11 +99,9 @@ public void setUp() throws Exception testResultsDir = new File(testContext.getCacheDir(), "pdfbox-test-output/crypto"); testResultsDir.mkdirs(); - if (Cipher.getMaxAllowedKeyLength("AES") != Integer.MAX_VALUE) - { - // we need strong encryption for these tests - fail("JCE unlimited strength jurisdiction policy files are not installed"); - } + // we need strong encryption for these tests + assertEquals("JCE unlimited strength jurisdiction policy files are not installed", + Integer.MAX_VALUE, Cipher.getMaxAllowedKeyLength("AES")); permission = new AccessPermission(); permission.setCanAssembleDocument(false); @@ -132,37 +133,20 @@ public void testPermissions() throws Exception restrAP.setCanExtractContent(false); restrAP.setCanModify(false); - byte[] inputFileAsByteArray = getFileResourceAsByteArray("PasswordSample-40bit.pdf"); - checkPerms(inputFileAsByteArray, "owner", fullAP); - checkPerms(inputFileAsByteArray, "user", restrAP); - try - { - checkPerms(inputFileAsByteArray, "", null); - fail("wrong password not detected"); - } - catch (IOException ex) - { - assertEquals("Cannot decrypt PDF, the password is incorrect", ex.getMessage()); - } + checkSeveralPerms(getFileResourceAsByteArray("PasswordSample-40bit.pdf"), fullAP, restrAP); restrAP.setCanAssembleDocument(false); restrAP.setCanExtractForAccessibility(false); restrAP.setCanPrintFaithful(false); - inputFileAsByteArray = getFileResourceAsByteArray("PasswordSample-128bit.pdf"); - checkPerms(inputFileAsByteArray, "owner", fullAP); - checkPerms(inputFileAsByteArray, "user", restrAP); - try - { - checkPerms(inputFileAsByteArray, "", null); - fail("wrong password not detected"); - } - catch (IOException ex) - { - assertEquals("Cannot decrypt PDF, the password is incorrect", ex.getMessage()); - } + checkSeveralPerms(getFileResourceAsByteArray("PasswordSample-128bit.pdf"), fullAP, restrAP); - inputFileAsByteArray = getFileResourceAsByteArray("PasswordSample-256bit.pdf"); + checkSeveralPerms(getFileResourceAsByteArray("PasswordSample-256bit.pdf"), fullAP, restrAP); + } + + private void checkSeveralPerms(byte[] inputFileAsByteArray, AccessPermission fullAP, + AccessPermission restrAP) throws IOException + { checkPerms(inputFileAsByteArray, "owner", fullAP); checkPerms(inputFileAsByteArray, "user", restrAP); try @@ -170,7 +154,7 @@ public void testPermissions() throws Exception checkPerms(inputFileAsByteArray, "", null); fail("wrong password not detected"); } - catch (IOException ex) + catch (InvalidPasswordException ex) { assertEquals("Cannot decrypt PDF, the password is incorrect", ex.getMessage()); } @@ -485,11 +469,85 @@ private void testSymmEncrForKeySizeInner(int keyLength, boolean preferAES, private byte[] getFileResourceAsByteArray(String testFileName) throws IOException { - return IOUtils.toByteArray(testContext.getAssets().open("pdfbox/com/tom_roush/pdfbox/pdmodel/encryption/" + testFileName)); + InputStream is = testContext.getAssets().open("pdfbox/com/tom_roush/pdfbox/pdmodel/encryption/" + testFileName); + try + { + return IOUtils.toByteArray(is); + } + finally + { + IOUtils.closeQuietly(is); + } } private byte[] getFileAsByteArray(File f) throws IOException { - return IOUtils.toByteArray(new FileInputStream(f)); + InputStream is = new FileInputStream(f); + try + { + return IOUtils.toByteArray(is); + } + finally + { + IOUtils.closeQuietly(is); + } + } + + /** + * PDFBOX-5955: test unusual RC4 encryption that has 40 or 48 bits instead of 128. + * + * @throws IOException + */ + @Test + public void testPDFBox5955() throws IOException + { + File TARGETPDFDIR = new File(testContext.getCacheDir(), "pdfs"); + TARGETPDFDIR.mkdirs(); + File file40bit = TestResourceGenerator.downloadTestResource(TARGETPDFDIR, "PDFBOX-5955-40bit.pdf", + "https://issues.apache.org/jira/secure/attachment/13074727/R%3D4%2C%20V%3D4%2C%2040-bit%20RC4.pdf"); + assumeTrue(file40bit.exists()); + File file48bit = TestResourceGenerator.downloadTestResource(TARGETPDFDIR, "PDFBOX-5955-48bit.pdf", + "https://issues.apache.org/jira/secure/attachment/13074728/R%3D4%2C%20V%3D4%2C%2048-bit%20RC4.pdf"); + assumeTrue(file48bit.exists()); + PDDocument doc = PDDocument.load(file40bit); + + PDFTextStripper stripper = new PDFTextStripper(); + String text = stripper.getText(doc); + assertTrue(text.contains("0x0446615747")); + doc.close(); + doc = PDDocument.load(file40bit); + stripper = new PDFTextStripper(); + text = stripper.getText(doc); + assertTrue(text.contains("0x0446615747")); + doc.close(); + doc = PDDocument.load(file48bit); + stripper = new PDFTextStripper(); + text = stripper.getText(doc); + assertTrue(text.contains("0x02988E82AFF8")); + doc.close(); + doc = PDDocument.load(file48bit); + stripper = new PDFTextStripper(); + text = stripper.getText(doc); + assertTrue(text.contains("0x02988E82AFF8")); + doc.close(); + } + + /** + * test AESV3 with R=5 and excess bytes. + * + * @throws IOException + */ + @Test + public void testPDFBox5639() throws IOException + { + File TARGETPDFDIR = new File(testContext.getCacheDir(), "pdfs"); + TARGETPDFDIR.mkdirs(); + File file = TestResourceGenerator.downloadTestResource(TARGETPDFDIR, "PDFBOX-5639.pdf", + "https://issues.apache.org/jira/secure/attachment/13061409/incorrect_password.pdf"); + assumeTrue(file.exists()); + PDDocument document = PDDocument.load(file, "JUL2023rfi"); + assertEquals(2, document.getNumberOfPages()); + document.close(); } } + diff --git a/library/src/androidTest/java/com/tom_roush/pdfbox/multipdf/PDFMergerUtilityTest.java b/library/src/androidTest/java/com/tom_roush/pdfbox/multipdf/PDFMergerUtilityTest.java index c59156aaf..28983d2e6 100644 --- a/library/src/androidTest/java/com/tom_roush/pdfbox/multipdf/PDFMergerUtilityTest.java +++ b/library/src/androidTest/java/com/tom_roush/pdfbox/multipdf/PDFMergerUtilityTest.java @@ -25,10 +25,13 @@ import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.util.Collections; import java.util.HashSet; +import java.util.List; +import java.util.TreeSet; import java.util.Map; import java.util.Set; @@ -44,24 +47,42 @@ import com.tom_roush.pdfbox.pdmodel.PDDocumentCatalog; import com.tom_roush.pdfbox.pdmodel.PDPage; import com.tom_roush.pdfbox.pdmodel.PDPageTree; +import com.tom_roush.pdfbox.pdmodel.PDResources; import com.tom_roush.pdfbox.pdmodel.common.COSObjectable; import com.tom_roush.pdfbox.pdmodel.common.PDNameTreeNode; import com.tom_roush.pdfbox.pdmodel.common.PDNumberTreeNode; +import com.tom_roush.pdfbox.pdmodel.documentinterchange.logicalstructure.PDMarkedContentReference; +import com.tom_roush.pdfbox.pdmodel.documentinterchange.logicalstructure.PDParentTreeValue; import com.tom_roush.pdfbox.pdmodel.documentinterchange.logicalstructure.PDStructureElement; +import com.tom_roush.pdfbox.pdmodel.documentinterchange.logicalstructure.PDStructureNode; import com.tom_roush.pdfbox.pdmodel.documentinterchange.logicalstructure.PDStructureTreeRoot; import com.tom_roush.pdfbox.pdmodel.interactive.annotation.PDAnnotation; +import com.tom_roush.pdfbox.pdmodel.interactive.annotation.PDAnnotationLink; +import com.tom_roush.pdfbox.pdmodel.interactive.annotation.PDAnnotationPopup; +import com.tom_roush.pdfbox.pdmodel.interactive.annotation.PDAnnotationText; import com.tom_roush.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget; import com.tom_roush.pdfbox.pdmodel.interactive.documentnavigation.destination.PDPageDestination; +import com.tom_roush.pdfbox.pdmodel.interactive.documentnavigation.destination.PDNamedDestination; import com.tom_roush.pdfbox.pdmodel.interactive.documentnavigation.destination.PDPageFitDestination; +import com.tom_roush.pdfbox.pdmodel.documentinterchange.markedcontent.PDMarkedContent; +import com.tom_roush.pdfbox.pdmodel.graphics.image.PDImageXObject; +import com.tom_roush.pdfbox.pdmodel.interactive.action.PDActionGoTo; import com.tom_roush.pdfbox.pdmodel.interactive.form.PDAcroForm; import com.tom_roush.pdfbox.pdmodel.interactive.form.PDField; import com.tom_roush.pdfbox.rendering.PDFRenderer; +import com.tom_roush.pdfbox.text.PDFMarkedContentExtractor; import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import org.junit.function.ThrowingRunnable; +import static junit.framework.TestCase.assertFalse; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.junit.Assume.assumeTrue; @@ -680,6 +701,7 @@ void checkWithNumberTree(PDDocument document) throws IOException { PDDocumentCatalog documentCatalog = document.getDocumentCatalog(); PDNumberTreeNode parentTree = documentCatalog.getStructureTreeRoot().getParentTree(); + assertNotEquals(-1, documentCatalog.getStructureTreeRoot().getParentTreeNextKey()); Map numberTreeAsMap = PDFMergerUtility.getNumberTreeAsMap(parentTree); Set keySet = numberTreeAsMap.keySet(); PDAcroForm acroForm = documentCatalog.getAcroForm(); @@ -698,11 +720,65 @@ void checkWithNumberTree(PDDocument document) throws IOException } } } - for (PDPage page : document.getPages()) + PDPageTree pageTree = document.getPages(); + for (PDPage page : pageTree) { + int pageNum = pageTree.indexOf(page) + 1; if (page.getStructParents() >= 0) { - assertTrue(keySet.contains(page.getStructParents())); + assertTrue("/StructParents " + page.getStructParents() + " from page " + pageNum + " not found in /ParentTree", + keySet.contains(page.getStructParents())); + PDParentTreeValue obj = (PDParentTreeValue) numberTreeAsMap.get(page.getStructParents()); + assertTrue("Expected array in page " + pageNum + ", got " + obj.getClass(), + obj.getCOSObject() instanceof COSArray); + COSArray array = (COSArray) obj.getCOSObject(); + + PDFMarkedContentExtractor markedContentExtractor = new PDFMarkedContentExtractor(); + markedContentExtractor.processPage(page); + List markedContents = markedContentExtractor.getMarkedContents(); + TreeSet set = new TreeSet(); + for (PDMarkedContent pdMarkedContent : markedContents) + { + COSDictionary pdmcProperties = pdMarkedContent.getProperties(); + if (pdmcProperties == null) + { + continue; + } + int mcid = pdMarkedContent.getMCID(); + if (mcid >= 0) + { + // "For a page object (...), the value shall be an array of references + // to the parent elements of those marked-content sequences." + // this means that the /Pg entry doesn't have to match the page + COSDictionary dict = (COSDictionary) array.getObject(mcid); + org.junit.Assert.assertNotNull(dict); + set.add(mcid); + PDStructureElement structureElemen = (PDStructureElement) PDStructureNode.create(dict); + List kids = structureElemen.getKids(); + boolean found = false; + for (Object kid : kids) + { + if (kid instanceof Integer && ((Integer) kid) == mcid) + { + found = true; + break; + } + if (kid instanceof PDMarkedContentReference) + { + PDMarkedContentReference mcr = (PDMarkedContentReference) kid; + if (mcid == mcr.getMCID()) + { + found = true; + break; + } + } + } + assertTrue("page: " + pageNum + ", mcid: " + mcid + " not found", found); + } + } + // actual count may be larger if last element is null, e.g. PDFBOX-4408 + // set can be empty, see last page of pdf_32000_2008.pdf + assertTrue(set.isEmpty() || set.last() <= array.size() - 1); } for (PDAnnotation ann : page.getAnnotations()) { @@ -736,11 +812,22 @@ public void testFileDeletion() throws IOException OutputStream out = new FileOutputStream(outFile); PDFMergerUtility merger = new PDFMergerUtility(); merger.setDestinationStream(out); - merger.addSource(inFile1); - merger.addSource(inFile2); + + // Unrelated: increase test coverage by testing inputStream + InputStream is1 = new FileInputStream(inFile1); + InputStream is2 = new FileInputStream(inFile1); + assertEquals(out, merger.getDestinationStream()); + merger.addSource(is1); + merger.addSource(is2); merger.mergeDocuments(MemoryUsageSetting.setupMainMemoryOnly()); + is1.close(); + is2.close(); out.close(); + PDDocument doc = PDDocument.load(outFile); + assertEquals(2, doc.getNumberOfPages()); + doc.close(); + assertTrue(inFile1.delete()); assertTrue(inFile2.delete()); assertTrue(outFile.delete()); @@ -809,8 +896,9 @@ private void checkForPageOrphans(PDDocument doc) throws IOException // StructTreeRoot/IDTree trees. PDPageTree pageTree = doc.getPages(); PDStructureTreeRoot structureTreeRoot = doc.getDocumentCatalog().getStructureTreeRoot(); - checkElement(pageTree, structureTreeRoot.getParentTree().getCOSObject()); - checkElement(pageTree, structureTreeRoot.getK()); + checkElement(pageTree, structureTreeRoot.getParentTree().getCOSObject(), structureTreeRoot.getCOSObject()); + assertNotNull(structureTreeRoot.getK()); + checkElement(pageTree, structureTreeRoot.getK(), structureTreeRoot.getCOSObject()); checkForIDTreeOrphans(pageTree, structureTreeRoot); } @@ -831,7 +919,7 @@ private void checkForIDTreeOrphans(PDPageTree pageTree, PDStructureTreeRoot stru } if (!element.getKids().isEmpty()) { - checkElement(pageTree, element.getCOSObject().getDictionaryObject(COSName.K)); + checkElement(pageTree, element.getCOSObject().getDictionaryObject(COSName.K), element.getCOSObject()); } } } @@ -870,6 +958,27 @@ else if (base instanceof COSDictionary) ++cnt; set.add(kdict); } + else if (kdict.containsKey(COSName.K)) + { + // at least 1 kid with dict with /Pg, /MCID and type /MCR + // happens with confidential file from PDFBOX-6009 + COSArray kidArray = kdict.getCOSArray(COSName.K); + if (kidArray != null) + { + for (int i = 0; i < kidArray.size(); ++i) + { + COSBase base2 = kidArray.getObject(i); + if (base2 instanceof COSDictionary && + ((COSDictionary) base2).containsKey(COSName.PG) && + ((COSDictionary) base2).containsKey(COSName.MCID)) + { + ++cnt; + set.add(kdict); + break; + } + } + } + } if (kdict.containsKey(COSName.K)) { walk(kdict.getDictionaryObject(COSName.K)); @@ -885,7 +994,7 @@ else if (base instanceof COSDictionary) // See PDF specification Table 325 – Entries in an object reference dictionary // example of file with /Kids: 000153.pdf 000208.pdf 000314.pdf 000359.pdf 000671.pdf // from digitalcorpora site - private void checkElement(PDPageTree pageTree, COSBase base) throws IOException + private void checkElement(PDPageTree pageTree, COSBase base, COSDictionary parentDict) throws IOException { if (base instanceof COSArray) { @@ -895,7 +1004,7 @@ private void checkElement(PDPageTree pageTree, COSBase base) throws IOException { base2 = ((COSObject) base2).getObject(); } - checkElement(pageTree, base2); + checkElement(pageTree, base2, null); } } else if (base instanceof COSDictionary) @@ -908,18 +1017,35 @@ else if (base instanceof COSDictionary) } if (kdict.containsKey(COSName.K)) { - checkElement(pageTree, kdict.getDictionaryObject(COSName.K)); + checkElement(pageTree, kdict.getDictionaryObject(COSName.K), kdict); + + // Check that the /P entry points to the correct object + PDStructureNode node = PDStructureNode.create(kdict); + for (Object obj : node.getKids()) + { + if (obj instanceof PDStructureElement) + { + PDStructureNode parent = ((PDStructureElement) obj).getParent(); + assertTrue(parent.getCOSObject() == kdict); + } + } return; } // if we're in a number tree, check /Nums and /Kids if (kdict.containsKey(COSName.KIDS)) { - checkElement(pageTree, kdict.getDictionaryObject(COSName.KIDS)); + checkElement(pageTree, kdict.getDictionaryObject(COSName.KIDS), kdict); } else if (kdict.containsKey(COSName.NUMS)) { - checkElement(pageTree, kdict.getDictionaryObject(COSName.NUMS)); + checkElement(pageTree, kdict.getDictionaryObject(COSName.NUMS), kdict); + } + + if (COSName.OBJR.equals(kdict.getDictionaryObject(COSName.TYPE)) || + COSName.MCR.equals(kdict.getDictionaryObject(COSName.TYPE))) + { + assertFalse(kdict.getCOSDictionary(COSName.PG) == null && parentDict.getCOSDictionary(COSName.PG) == null); } // if we're an object reference dictionary (/OBJR), check the obj @@ -927,7 +1053,8 @@ else if (kdict.containsKey(COSName.NUMS)) { COSDictionary obj = (COSDictionary) kdict.getDictionaryObject(COSName.OBJ); COSBase type = obj.getDictionaryObject(COSName.TYPE); - if (COSName.ANNOT.equals(type)) + COSBase subtype = obj.getDictionaryObject(COSName.SUBTYPE); + if (COSName.ANNOT.equals(type) || COSName.LINK.equals(subtype)) { PDAnnotation annotation = PDAnnotation.createAnnotation(obj); PDPage page = annotation.getPage(); @@ -1032,4 +1159,357 @@ private void checkForPage(PDPageTree pageTree, PDStructureElement structureEleme Assert.assertNotEquals("Page is not in the page tree", -1, pageTree.indexOf(page)); } } + + @Test + public void testSplitWithStructureTree() throws IOException + { + PDDocument doc = PDDocument.load(testContext.getAssets().open(SRCDIR + "/" + "PDFBOX-4417-001031.pdf")); + Splitter splitter = new Splitter(); + splitter.setStartPage(1); + splitter.setEndPage(2); + splitter.setSplitAtPage(2); + List splitResult = splitter.split(doc); + assertEquals(1, splitResult.size()); + PDDocument dstDoc = splitResult.get(0); + assertEquals(2, dstDoc.getNumberOfPages()); + checkForPageOrphans(dstDoc); + // these tests just verify the status quo. Changes should be checked visually with + // a PDF viewer that can display structural information. + PDStructureTreeRoot structureTreeRoot = dstDoc.getDocumentCatalog().getStructureTreeRoot(); + assertEquals(126, PDFMergerUtility.getIDTreeAsMap(structureTreeRoot.getIDTree()).size()); + assertEquals(2, PDFMergerUtility.getNumberTreeAsMap(structureTreeRoot.getParentTree()).size()); + assertEquals(6, structureTreeRoot.getRoleMap().size()); + dstDoc.close(); + doc.close(); + } + + @Test + public void testSplitWithStructureTreeAndDestinations() throws IOException + { + PDDocument doc = PDDocument.load(testContext.getAssets().open(SRCDIR + "/" + "PDFBOX-5762-722238.pdf")); + Splitter splitter = new Splitter(); + splitter.setStartPage(1); + splitter.setEndPage(2); + splitter.setSplitAtPage(2); + List splitResult = splitter.split(doc); + assertEquals(1, splitResult.size()); + PDDocument dstDoc = splitResult.get(0); + assertEquals(2, dstDoc.getNumberOfPages()); + checkForPageOrphans(dstDoc); + // these tests just verify the status quo. Changes should be checked visually with + // a PDF viewer that can display structural information. + PDStructureTreeRoot structureTreeRoot = dstDoc.getDocumentCatalog().getStructureTreeRoot(); + assertEquals(7, PDFMergerUtility.getNumberTreeAsMap(structureTreeRoot.getParentTree()).size()); + assertEquals(4, structureTreeRoot.getRoleMap().size()); + + // check that destinations are fixed (only the two first point to the split doc) + List annotations = dstDoc.getPage(0).getAnnotations(); + assertEquals(5, annotations.size()); + PDAnnotationLink link1 = (PDAnnotationLink) annotations.get(0); + PDAnnotationLink link2 = (PDAnnotationLink) annotations.get(1); + PDAnnotationLink link3 = (PDAnnotationLink) annotations.get(2); + PDAnnotationLink link4 = (PDAnnotationLink) annotations.get(3); + PDAnnotationLink link5 = (PDAnnotationLink) annotations.get(4); + PDPageDestination pd1 = + (PDPageDestination) ((PDActionGoTo) link1.getAction()).getDestination(); + PDPageDestination pd2 = + (PDPageDestination) ((PDActionGoTo) link2.getAction()).getDestination(); + PDPageDestination pd3 = + (PDPageDestination) ((PDActionGoTo) link3.getAction()).getDestination(); + PDPageDestination pd4 = + (PDPageDestination) ((PDActionGoTo) link4.getAction()).getDestination(); + PDPageDestination pd5 = + (PDPageDestination) ((PDActionGoTo) link5.getAction()).getDestination(); + PDPageTree pageTree = dstDoc.getPages(); + assertEquals(0, pageTree.indexOf(pd1.getPage())); + assertEquals(1, pageTree.indexOf(pd2.getPage())); + assertNull(pd3.getPage()); + assertNull(pd4.getPage()); + assertNull(pd5.getPage()); + dstDoc.close(); + doc.close(); + } + + /** + * PDFBOX-5929: Check that orphan annotations are removed from the structure tree if annotations + * were removed from the pages (don't do that!). + * + * @throws IOException + */ + @Test + public void testSplitWithStructureTreeAndDestinationsAndRemovedAnnotations() throws IOException + { + PDDocument doc = PDDocument.load(testContext.getAssets().open(SRCDIR + "/" + "PDFBOX-5762-722238.pdf")); + Splitter splitter = new Splitter(); + for (PDPage page : doc.getPages()) + { + page.setAnnotations(Collections.EMPTY_LIST); + } + splitter.setStartPage(1); + splitter.setEndPage(2); + splitter.setSplitAtPage(2); + List splitResult = splitter.split(doc); + assertEquals(1, splitResult.size()); + PDDocument dstDoc = splitResult.get(0); + assertEquals(2, dstDoc.getNumberOfPages()); + checkForPageOrphans(dstDoc); + dstDoc.close(); + doc.close(); + } + + /** + * Check for the bug that happened in PDFBOX-5792, where a destination was outside a target + * document and hit an NPE in the next call of Splitter.fixDestinations(). + * + * @throws IOException + */ + @Test + public void testSinglePageSplit() throws IOException + { + PDDocument doc = PDDocument.load(testContext.getAssets().open(SRCDIR + "/" + "PDFBOX-5792-240045.pdf")); + Splitter splitter = new Splitter(); + splitter.setSplitAtPage(1); + List splitResult = splitter.split(doc); + assertEquals(6, splitResult.size()); + for (PDDocument dstDoc : splitResult) + { + assertEquals(1, dstDoc.getNumberOfPages()); + checkForPageOrphans(dstDoc); + for (PDAnnotation ann : dstDoc.getPage(0).getAnnotations()) + { + PDAnnotationLink link = (PDAnnotationLink) ann; + PDActionGoTo action = (PDActionGoTo) link.getAction(); + PDPageDestination destination = (PDPageDestination) action.getDestination(); + assertNull(destination.getPage()); + } + } + PDStructureTreeRoot structureTreeRoot1 = splitResult.get(0).getDocumentCatalog().getStructureTreeRoot(); + assertEquals(6, PDFMergerUtility.getNumberTreeAsMap(structureTreeRoot1.getParentTree()).size()); + assertEquals(3, structureTreeRoot1.getRoleMap().size()); + PDStructureTreeRoot structureTreeRoot2 = splitResult.get(1).getDocumentCatalog().getStructureTreeRoot(); + assertEquals(6, PDFMergerUtility.getNumberTreeAsMap(structureTreeRoot2.getParentTree()).size()); + assertEquals(3, structureTreeRoot2.getRoleMap().size()); + PDStructureTreeRoot structureTreeRoot3 = splitResult.get(2).getDocumentCatalog().getStructureTreeRoot(); + assertEquals(6, PDFMergerUtility.getNumberTreeAsMap(structureTreeRoot3.getParentTree()).size()); + assertEquals(4, structureTreeRoot3.getRoleMap().size()); + PDStructureTreeRoot structureTreeRoot4 = splitResult.get(3).getDocumentCatalog().getStructureTreeRoot(); + assertEquals(5, PDFMergerUtility.getNumberTreeAsMap(structureTreeRoot4.getParentTree()).size()); + assertEquals(4, structureTreeRoot4.getRoleMap().size()); + PDStructureTreeRoot structureTreeRoot5 = splitResult.get(4).getDocumentCatalog().getStructureTreeRoot(); + assertEquals(1, PDFMergerUtility.getNumberTreeAsMap(structureTreeRoot5.getParentTree()).size()); + assertEquals(6, structureTreeRoot5.getRoleMap().size()); + PDStructureTreeRoot structureTreeRoot6 = splitResult.get(5).getDocumentCatalog().getStructureTreeRoot(); + assertEquals(1, PDFMergerUtility.getNumberTreeAsMap(structureTreeRoot6.getParentTree()).size()); + assertEquals(7, structureTreeRoot6.getRoleMap().size()); + for (PDDocument dstDoc : splitResult) + { + dstDoc.close(); + } + doc.close(); + } + + @Test + public void testSplitWithPopupAnnotations() throws IOException + { + PDDocument doc = PDDocument.load(testContext.getAssets().open(SRCDIR + "/" + "PDFBOX-5809-509329.pdf")); + Splitter splitter = new Splitter(); + splitter.setStartPage(3); + splitter.setEndPage(3); + splitter.setSplitAtPage(1); + List splitResult = splitter.split(doc); + assertEquals(1, splitResult.size()); + PDDocument dstDoc = splitResult.get(0); + checkForPageOrphans(dstDoc); + assertEquals(1, dstDoc.getNumberOfPages()); + List annotations = dstDoc.getPage(0).getAnnotations(); + assertEquals(5, annotations.size()); + PDAnnotationText annotationText3 = (PDAnnotationText) annotations.get(3); + PDAnnotationPopup annotationPopup4 = (PDAnnotationPopup) annotations.get(4); + assertEquals(annotationText3.getPopup(), annotationPopup4); + assertEquals(annotationPopup4.getParent(), annotationText3); + assertEquals(annotationText3.getPage(), dstDoc.getPage(0)); + dstDoc.close(); + + // Check that source document is ok + annotations = doc.getPage(2).getAnnotations(); + assertEquals(5, annotations.size()); + annotationText3 = (PDAnnotationText) annotations.get(3); + annotationPopup4 = (PDAnnotationPopup) annotations.get(4); + assertEquals(annotationText3.getPopup(), annotationPopup4); + assertEquals(annotationPopup4.getParent(), annotationText3); + assertEquals(annotationText3.getPage(), doc.getPage(2)); + + doc.close(); + } + + @Test + public void testSplitWithBrokenDestination() throws IOException + { + PDDocument doc = PDDocument.load(testContext.getAssets().open(SRCDIR + "/" + "PDFBOX-5811-362972.pdf")); + Splitter splitter = new Splitter(); + splitter.setStartPage(2); + splitter.setEndPage(2); + List splitResult = splitter.split(doc); + assertEquals(1, splitResult.size()); + List annotations; + PDDocument dstDoc = splitResult.get(0); + checkForPageOrphans(dstDoc); + assertEquals(1, dstDoc.getNumberOfPages()); + annotations = dstDoc.getPage(0).getAnnotations(); + assertEquals(1, annotations.size()); + PDAnnotationLink link = (PDAnnotationLink) annotations.get(0); + assertNull(link.getDestination()); + dstDoc.close(); + // Check source document + annotations = doc.getPage(1).getAnnotations(); + assertEquals(1, annotations.size()); + final PDAnnotationLink link2 = (PDAnnotationLink) annotations.get(0); + assertThrows(IOException.class, new ThrowingRunnable() + { + @Override + public void run() throws Throwable + { + link2.getDestination(); + } + }); + doc.close(); + } + + @Test + public void testSplitWithNamedDestinations() throws IOException + { + PDDocument doc = PDDocument.load(testContext.getAssets().open(SRCDIR + "/" + "PDFBOX-5840-410609.pdf")); + Splitter splitter = new Splitter(); + splitter.setSplitAtPage(6); + List splitResult = splitter.split(doc); + assertEquals(1, splitResult.size()); + List annotations; + PDDocument dstDoc = splitResult.get(0); + checkForPageOrphans(dstDoc); + assertEquals(6, dstDoc.getNumberOfPages()); + annotations = dstDoc.getPage(0).getAnnotations(); + assertEquals(5, annotations.size()); + PDAnnotationLink link1 = (PDAnnotationLink) annotations.get(0); + PDAnnotationLink link2 = (PDAnnotationLink) annotations.get(1); + PDAnnotationLink link3 = (PDAnnotationLink) annotations.get(2); + PDAnnotationLink link4 = (PDAnnotationLink) annotations.get(3); + PDAnnotationLink link5 = (PDAnnotationLink) annotations.get(4); + PDPageDestination pd1 = + (PDPageDestination) ((PDActionGoTo) link1.getAction()).getDestination(); + PDPageDestination pd2 = + (PDPageDestination) ((PDActionGoTo) link2.getAction()).getDestination(); + PDPageDestination pd3 = + (PDPageDestination) ((PDActionGoTo) link3.getAction()).getDestination(); + PDPageDestination pd4 = + (PDPageDestination) ((PDActionGoTo) link4.getAction()).getDestination(); + PDPageDestination pd5 = + (PDPageDestination) ((PDActionGoTo) link5.getAction()).getDestination(); + PDPageTree pageTree = dstDoc.getPages(); + assertEquals(0, pageTree.indexOf(pd1.getPage())); + assertEquals(1, pageTree.indexOf(pd2.getPage())); + assertEquals(3, pageTree.indexOf(pd3.getPage())); + assertEquals(3, pageTree.indexOf(pd4.getPage())); + assertEquals(5, pageTree.indexOf(pd5.getPage())); + dstDoc.close(); + // Check that source document is unchanged + annotations = doc.getPage(0).getAnnotations(); + assertEquals(5, annotations.size()); + PDAnnotationLink link = (PDAnnotationLink) annotations.get(0); + assertTrue(((PDActionGoTo) link.getAction()).getDestination() instanceof PDNamedDestination); + doc.close(); + } + + /** + * PDFBOX-6009: This test verifies that the destination PDF has a /K tree. Before the change, + * nodes with the "wrong" /Pg entries were deleted entirely and because this file has a /Pg + * entry with page 1 at the top, the entire /K tree would be missing. + * + * @throws IOException + */ + @Test + public void testSplitWithPgEntryAtTheTop() throws IOException + { + File inputPdf = TestResourceGenerator.downloadTestResource(TARGETPDFDIR, "PDFBOX-6009.pdf", + "https://issues.apache.org/jira/secure/attachment/13076529/pdfbox-split-missing-tags_mail%2015.5.2025.pdf"); + assumeTrue(inputPdf.exists()); + PDDocument doc = PDDocument.load(inputPdf); + Splitter splitter = new Splitter(); + splitter.setSplitAtPage(1); + List splitResult = splitter.split(doc); + assertEquals(3, splitResult.size()); + for (PDDocument dstDoc : splitResult) + { + assertEquals(1, dstDoc.getNumberOfPages()); + checkWithNumberTree(dstDoc); + checkForPageOrphans(dstDoc); + } + for (PDDocument dstDoc : splitResult) + { + dstDoc.close(); + } + doc.close(); + } + + /** + * PDFBOX-6018: Test split a PDF with popup annotations that are not in the annotations list. + * Verify that after splitting, they still link back to their markup annotation and these to the + * page. + * + * @throws IOException + */ + @Test + public void testSplitWithOrphanPopupAnnotation() throws IOException + { + PDDocument doc = PDDocument.load(testContext.getAssets().open(SRCDIR + "/" + "PDFBOX-6018-099267-p9-OrphanPopups.pdf")); + Splitter splitter = new Splitter(); + List splitResult = splitter.split(doc); + assertEquals(1, splitResult.size()); + PDDocument dstDoc = splitResult.get(0); + assertEquals(1, dstDoc.getNumberOfPages()); + PDPage page = dstDoc.getPage(0); + List annotations = page.getAnnotations(); + assertEquals(2, annotations.size()); + PDAnnotationText ann0 = (PDAnnotationText) annotations.get(0); + PDAnnotationText ann1 = (PDAnnotationText) annotations.get(1); + assertEquals(page, ann0.getPage()); + assertEquals(page, ann1.getPage()); + assertEquals(ann0, ann0.getPopup().getParent()); + assertEquals(ann1, ann1.getPopup().getParent()); + dstDoc.close(); + doc.close(); + } + + /** + * PDFBOX-5939: merge a file with an outline that has itself as a parent without producing a + * stack overflow. + * + * @throws IOException + */ + @Test + public void testOutlinesSelfParent() throws IOException + { + File inputPdf = TestResourceGenerator.downloadTestResource(TARGETPDFDIR, "PDFBOX-5939-google-docs-1.pdf", + "https://issues.apache.org/jira/secure/attachment/13074264/google-docs-1.pdf"); + assumeTrue(inputPdf.exists()); + PDFMergerUtility pdfMergerUtility = new PDFMergerUtility(); + pdfMergerUtility.addSource(new File(TARGETPDFDIR, "PDFBOX-5939-google-docs-1.pdf")); + pdfMergerUtility.addSource(new File(TARGETPDFDIR, "PDFBOX-5939-google-docs-1.pdf")); + pdfMergerUtility.setDestinationFileName(TARGETTESTDIR + "PDFBOX-5939-google-docs-result.pdf"); + pdfMergerUtility.mergeDocuments(MemoryUsageSetting.setupMainMemoryOnly()); + + PDDocument mergedDoc = + PDDocument.load(new File(TARGETTESTDIR, "PDFBOX-5939-google-docs-result.pdf")); + assertEquals(2, mergedDoc.getNumberOfPages()); + mergedDoc.close(); + } + +// /** +// * PDFBOX-515 / PDFBOX-5950: test merging of two files where one file has a stream deep down in +// * the info dictionary (Info/ImPDF/Images/Kids/[0]). +// * TODO: PdfBox-Android not ported: sources ship as a zip (pdfboxpdfs.zip) that maven unpacks +// * into target/pdfs; TestResourceGenerator cannot unpack archives. +// */ +// @Test +// public void testPDFBox515() throws IOException } + diff --git a/library/src/androidTest/java/com/tom_roush/pdfbox/pdmodel/font/PDFontTest.java b/library/src/androidTest/java/com/tom_roush/pdfbox/pdmodel/font/PDFontTest.java index 2c7614c70..6428c8c94 100644 --- a/library/src/androidTest/java/com/tom_roush/pdfbox/pdmodel/font/PDFontTest.java +++ b/library/src/androidTest/java/com/tom_roush/pdfbox/pdmodel/font/PDFontTest.java @@ -37,6 +37,8 @@ import java.util.ArrayList; import java.util.List; +import com.tom_roush.fontbox.ttf.OTFParser; +import com.tom_roush.fontbox.ttf.OpenTypeFont; import com.tom_roush.fontbox.ttf.TTFParser; import com.tom_roush.fontbox.ttf.TrueTypeCollection; import com.tom_roush.fontbox.ttf.TrueTypeFont; @@ -156,7 +158,9 @@ public void testPDFBOX4115() throws IOException PDPage page = new PDPage(); PDPageContentStream contentStream = new PDPageContentStream(doc, page); - PDType1Font font = new PDType1Font(doc, new FileInputStream(fontFile), WinAnsiEncoding.INSTANCE); + InputStream is = new FileInputStream(fontFile); + PDType1Font font = new PDType1Font(doc, is, WinAnsiEncoding.INSTANCE); + is.close(); contentStream.beginText(); contentStream.setFont(font, 10); @@ -459,4 +463,94 @@ public void testPDFBox5484() throws IOException Assert.assertTrue(area1.equals(area2)); // assertEquals does not test equals() doc.close(); } + + /** + * Check space width. + * + * @throws IOException + */ + @Test + public void PDFBOX5920Type0() throws IOException + { + InputStream is = testContext.getAssets().open( + "com/tom_roush/pdfbox/resources/ttf/LiberationSans-Regular.ttf"); + PDDocument document = new PDDocument(); + PDFont font = PDType0Font.load(document, is, false); + Assert.assertEquals(20064.0f, + font.getStringWidth("The quick brown fox jumps over the lazy dog."), 0.001f); + Assert.assertEquals(278.0f, font.getSpaceWidth(), 0.001f); + document.close(); + } + + /** + * Check space width. + * + * @throws IOException + */ + @Test + public void PDFBOX5920TrueType() throws IOException + { + InputStream is = testContext.getAssets().open( + "com/tom_roush/pdfbox/resources/ttf/LiberationSans-Regular.ttf"); + PDDocument document = new PDDocument(); + PDFont font = PDTrueTypeFont.load(document, is, WinAnsiEncoding.INSTANCE); + Assert.assertEquals(20064.0f, + font.getStringWidth("The quick brown fox jumps over the lazy dog."), 0.001f); + Assert.assertEquals(278.0f, font.getSpaceWidth(), 0.001f); + document.close(); + } + + @Test + public void testSymbol() throws IOException + { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + PDDocument doc = new PDDocument(); + PDPage page = new PDPage(); + PDPageContentStream contentStream = new PDPageContentStream(doc, page); + contentStream.beginText(); + contentStream.setFont(PDType1Font.SYMBOL, 10); + contentStream.newLineAtOffset(10, 700); + // Note that the Alpha is the greek alpha, but the Omega is the Ohm symbol + // (Tested on Windows) + contentStream.showText("\u0391 \u2126"); + contentStream.endText(); + contentStream.close(); + doc.addPage(page); + doc.save(baos); + doc.close(); + + doc = PDDocument.load(baos.toByteArray()); + PDFTextStripper stripper = new PDFTextStripper(); + String text = stripper.getText(doc); + Assert.assertEquals("\u0391 \u2126", text.trim()); + doc.close(); + } + + // PDFBOX-6172: test that exception is thrown on otf font with CID and GID not identical. + @Test + public void testPDFBox6172() throws IOException + { + PDDocument document = new PDDocument(); + File fontFile = TestResourceGenerator.downloadTestResource(IN_DIR, "NotoSansSC-Regular.otf", + "https://issues.apache.org/jira/secure/attachment/13081021/NotoSansSC-Regular.otf"); + assumeTrue(fontFile.exists()); + InputStream is = new FileInputStream(fontFile); + OpenTypeFont otf = new OTFParser().parse(is); + try + { + PDType0Font.load(document, otf, false); + } + catch (IllegalStateException ex) + { + Assert.assertEquals("CID and GID not identical: CID 628 != GID 372, use a ttf font instead", ex.getMessage()); + return; + } + finally + { + document.close(); + } + Assert.fail("should have thrown IllegalStateException"); + } } + diff --git a/library/src/androidTest/java/com/tom_roush/pdfbox/pdmodel/graphics/image/CCITTFactoryTest.java b/library/src/androidTest/java/com/tom_roush/pdfbox/pdmodel/graphics/image/CCITTFactoryTest.java index 537fa99e7..34ae9db51 100644 --- a/library/src/androidTest/java/com/tom_roush/pdfbox/pdmodel/graphics/image/CCITTFactoryTest.java +++ b/library/src/androidTest/java/com/tom_roush/pdfbox/pdmodel/graphics/image/CCITTFactoryTest.java @@ -283,4 +283,11 @@ public void testByteShortPaddedWithGarbage() throws IOException } document.close(); } + +// /** +// * PDFBOX-6164: test support of TIFF-files with FillOrder=2 +// * TODO: PdfBox-Android not ported: downloads Wing.tif from issues.apache.org and +// * compares against a javax.imageio-decoded reference image +// */ +// public void testFillOrder2() throws IOException, URISyntaxException } diff --git a/library/src/androidTest/java/com/tom_roush/pdfbox/pdmodel/graphics/image/JPEGFactoryTest.java b/library/src/androidTest/java/com/tom_roush/pdfbox/pdmodel/graphics/image/JPEGFactoryTest.java index b237d5f95..a6cc4dc46 100644 --- a/library/src/androidTest/java/com/tom_roush/pdfbox/pdmodel/graphics/image/JPEGFactoryTest.java +++ b/library/src/androidTest/java/com/tom_roush/pdfbox/pdmodel/graphics/image/JPEGFactoryTest.java @@ -23,7 +23,6 @@ import androidx.test.platform.app.InstrumentationRegistry; import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; @@ -85,6 +84,7 @@ public void testCreateFromStream() throws IOException doWritePDF(document, ximage, testResultsDir, "jpegrgbstream.pdf"); checkJpegStream(testResultsDir, "jpegrgbstream.pdf", testContext.getAssets().open( "pdfbox/com/tom_roush/pdfbox/pdmodel/graphics/image/jpeg.jpg")); + stream.close(); } /* @@ -101,6 +101,7 @@ public void testCreateFromStreamCMYK() throws IOException doWritePDF(document, ximage, testResultsDir, "jpegcmykstream.pdf"); checkJpegStream(testResultsDir, "jpegcmykstream.pdf", testContext.getAssets().open("pdfbox/com/tom_roush/pdfbox/pdmodel/graphics/image/jpegcmyk.jpg")); + stream.close(); } /** @@ -119,6 +120,7 @@ public void testCreateFromStream256() throws IOException doWritePDF(document, ximage, testResultsDir, "jpeg256stream.pdf"); checkJpegStream(testResultsDir, "jpeg256stream.pdf", testContext.getAssets().open( "pdfbox/com/tom_roush/pdfbox/pdmodel/graphics/image/jpeg256.jpg")); + stream.close(); } /** @@ -330,20 +332,16 @@ public void testPDFBox5137() throws IOException // check whether it is possible to extract the jpeg stream exactly // as it was passed to createFromStream - private void checkJpegStream(File testResultsDir, String filename, InputStream resourceStream) + private void checkJpegStream(File testResultsDir, String filename, InputStream expected) throws IOException { PDDocument doc = PDDocument.load(new File(testResultsDir, filename)); PDImageXObject img = (PDImageXObject) doc.getPage(0).getResources().getXObject(COSName.getPDFName("Im1")); InputStream dctStream = img.createInputStream(Arrays.asList(COSName.DCT_DECODE.getName())); - ByteArrayOutputStream baos1 = new ByteArrayOutputStream(); - ByteArrayOutputStream baos2 = new ByteArrayOutputStream(); - IOUtils.copy(resourceStream, baos1); - IOUtils.copy(dctStream, baos2); - resourceStream.close(); + assertArrayEquals(IOUtils.toByteArray(expected), IOUtils.toByteArray(dctStream)); + expected.close(); dctStream.close(); - assertArrayEquals(baos1.toByteArray(), baos2.toByteArray()); doc.close(); } } diff --git a/library/src/androidTest/java/com/tom_roush/pdfbox/pdmodel/graphics/image/LosslessFactoryTest.java b/library/src/androidTest/java/com/tom_roush/pdfbox/pdmodel/graphics/image/LosslessFactoryTest.java index b7a930540..92c017588 100644 --- a/library/src/androidTest/java/com/tom_roush/pdfbox/pdmodel/graphics/image/LosslessFactoryTest.java +++ b/library/src/androidTest/java/com/tom_roush/pdfbox/pdmodel/graphics/image/LosslessFactoryTest.java @@ -172,7 +172,7 @@ public void testCreateLosslessFromImageINT_ARGB() throws IOException validate(ximage, 8, argbImage.getWidth(), argbImage.getHeight(), "png", PDDeviceRGB.INSTANCE.getName()); checkIdent(argbImage, ximage.getImage()); - checkIdentRGB(argbImage, ximage.getOpaqueImage()); + checkIdentRGB(argbImage, ximage.getOpaqueImage(null, 1)); assertNotNull(ximage.getSoftMask()); validate(ximage.getSoftMask(), 8, argbImage.getWidth(), argbImage.getHeight(), "png", @@ -180,6 +180,7 @@ public void testCreateLosslessFromImageINT_ARGB() throws IOException assertTrue(colorCount(ximage.getSoftMask().getImage()) > image.getHeight() / 10); doWritePDF(document, ximage, testResultsDir, "intargb.pdf"); + document.close(); } // testCreateLosslessFromImageBITMASK_INT_ARGB: Android does not have bitmask transparency @@ -224,13 +225,14 @@ public void testCreateLosslessFromImage4BYTE_ABGR() throws IOException validate(ximage, 8, w, h, "png", PDDeviceRGB.INSTANCE.getName()); checkIdent(argbImage, ximage.getImage()); - checkIdentRGB(argbImage, ximage.getOpaqueImage()); + checkIdentRGB(argbImage, ximage.getOpaqueImage(null, 1)); assertNotNull(ximage.getSoftMask()); validate(ximage.getSoftMask(), 8, w, h, "png", PDDeviceGray.INSTANCE.getName()); assertTrue(colorCount(ximage.getSoftMask().getImage()) > image.getHeight() / 10); doWritePDF(document, ximage, testResultsDir, "4babgr.pdf"); + document.close(); } /** @@ -268,11 +270,12 @@ public void testCreateLosslessFromImageUSHORT_555_RGB() throws IOException validate(ximage, 8, w, h, "png", PDDeviceRGB.INSTANCE.getName()); checkIdent(rgbImage, ximage.getImage()); - checkIdentRGB(rgbImage, ximage.getOpaqueImage()); + checkIdentRGB(rgbImage, ximage.getOpaqueImage(null, 1)); assertNull(ximage.getSoftMask()); doWritePDF(document, ximage, testResultsDir, "ushort555rgb.pdf"); + document.close(); } // TODO: PdfBox-Android : testCreateLosslessFromTransparentGIF: GIF images not currently supported @@ -385,12 +388,13 @@ public void testCreateLosslessFrom16BitPNG() throws IOException int h = image.getHeight(); validate(ximage, 8, w, h, "png", PDDeviceRGB.INSTANCE.getName()); checkIdent(compareImage, ximage.getImage()); - checkIdentRGB(compareImage, ximage.getOpaqueImage()); + checkIdentRGB(compareImage, ximage.getOpaqueImage(null, 1)); assertNotNull(ximage.getSoftMask()); validate(ximage.getSoftMask(), 8, w, h, "png", PDDeviceGray.INSTANCE.getName()); // assertEquals(35, colorCount(ximage.getSoftMask().getImage())); TODO: PdfBox-Android doWritePDF(document, ximage, testResultsDir, "png16bit.pdf"); + document.close(); } } diff --git a/library/src/androidTest/java/com/tom_roush/pdfbox/pdmodel/graphics/image/PDImageXObjectTest.java b/library/src/androidTest/java/com/tom_roush/pdfbox/pdmodel/graphics/image/PDImageXObjectTest.java index 6d6b0bcc7..1c1ad0011 100644 --- a/library/src/androidTest/java/com/tom_roush/pdfbox/pdmodel/graphics/image/PDImageXObjectTest.java +++ b/library/src/androidTest/java/com/tom_roush/pdfbox/pdmodel/graphics/image/PDImageXObjectTest.java @@ -24,6 +24,7 @@ import java.io.File; import java.io.FileInputStream; +import java.io.InputStream; import java.io.IOException; import java.net.URISyntaxException; @@ -173,7 +174,9 @@ private void testCompareCreatedFileByExtensionWithCreatedByJPEGFactory(String fi File file = TestResourceGenerator.copyStreamToFile(CACHE_DIR, filename, testContext.getAssets().open(inPath + filename)); PDImageXObject image = PDImageXObject.createFromFileByExtension(file, doc); - PDImageXObject expectedImage = JPEGFactory.createFromStream(doc, new FileInputStream(file)); + InputStream is = new FileInputStream(file); + PDImageXObject expectedImage = JPEGFactory.createFromStream(doc, is); + is.close(); Assert.assertEquals(expectedImage.getSuffix(), image.getSuffix()); checkIdentARGB(image.getImage(), expectedImage.getImage()); @@ -219,7 +222,9 @@ private void testCompareCreatedFileWithCreatedByJPEGFactory(String filename) File file = TestResourceGenerator.copyStreamToFile(CACHE_DIR, filename, testContext.getAssets().open(inPath + filename)); PDImageXObject image = PDImageXObject.createFromFile(file.getAbsolutePath(), doc); - PDImageXObject expectedImage = JPEGFactory.createFromStream(doc, new FileInputStream(file)); + InputStream is = new FileInputStream(file); + PDImageXObject expectedImage = JPEGFactory.createFromStream(doc, is); + is.close(); Assert.assertEquals(expectedImage.getSuffix(), image.getSuffix()); checkIdentARGB(image.getImage(), expectedImage.getImage()); @@ -265,7 +270,9 @@ private void testCompareCreatedByContentWithCreatedByJPEGFactory(String filename File file = TestResourceGenerator.copyStreamToFile(CACHE_DIR, filename, testContext.getAssets().open(inPath + filename)); PDImageXObject image = PDImageXObject.createFromFileByContent(file, doc); - PDImageXObject expectedImage = JPEGFactory.createFromStream(doc, new FileInputStream(file)); + InputStream is = new FileInputStream(file); + PDImageXObject expectedImage = JPEGFactory.createFromStream(doc, is); + is.close(); Assert.assertEquals(expectedImage.getSuffix(), image.getSuffix()); checkIdentARGB(image.getImage(), expectedImage.getImage()); @@ -281,7 +288,9 @@ private void testCompareCreatedFromByteArrayWithCreatedByLosslessFactory(String { PDDocument doc = new PDDocument(); File file = TestResourceGenerator.copyStreamToFile(CACHE_DIR, filename, testContext.getAssets().open(inPath + filename)); - byte[] byteArray = IOUtils.toByteArray(new FileInputStream(file)); + InputStream is = new FileInputStream(file); + byte[] byteArray = IOUtils.toByteArray(is); + is.close(); PDImageXObject image = PDImageXObject.createFromByteArray(doc, byteArray, null); Bitmap bim = BitmapFactory.decodeStream(testContext.getAssets().open(inPath + filename)); @@ -298,7 +307,9 @@ private void testCompareCreatedFromByteArrayWithCreatedByCCITTFactory(String fil { PDDocument doc = new PDDocument(); File file = TestResourceGenerator.copyStreamToFile(CACHE_DIR, filename, testContext.getAssets().open(inPath + filename)); - byte[] byteArray = IOUtils.toByteArray(new FileInputStream(file)); + InputStream is = new FileInputStream(file); + byte[] byteArray = IOUtils.toByteArray(is); + is.close(); PDImageXObject image = PDImageXObject.createFromByteArray(doc, byteArray, null); PDImageXObject expectedImage = CCITTFactory.createFromFile(doc, file); @@ -314,10 +325,14 @@ private void testCompareCreatedFromByteArrayWithCreatedByJPEGFactory(String file { PDDocument doc = new PDDocument(); File file = TestResourceGenerator.copyStreamToFile(CACHE_DIR, filename, testContext.getAssets().open(inPath + filename)); - byte[] byteArray = IOUtils.toByteArray(new FileInputStream(file)); + InputStream is1 = new FileInputStream(file); + byte[] byteArray = IOUtils.toByteArray(is1); + is1.close(); PDImageXObject image = PDImageXObject.createFromByteArray(doc, byteArray, null); - PDImageXObject expectedImage = JPEGFactory.createFromStream(doc, new FileInputStream(file)); + InputStream is2 = new FileInputStream(file); + PDImageXObject expectedImage = JPEGFactory.createFromStream(doc, is2); + is2.close(); Assert.assertEquals(expectedImage.getSuffix(), image.getSuffix()); checkIdentARGB(image.getImage(), expectedImage.getImage()); diff --git a/library/src/androidTest/java/com/tom_roush/pdfbox/pdmodel/graphics/image/SampledImageReaderTest.java b/library/src/androidTest/java/com/tom_roush/pdfbox/pdmodel/graphics/image/SampledImageReaderTest.java new file mode 100644 index 000000000..c67e7ab7e --- /dev/null +++ b/library/src/androidTest/java/com/tom_roush/pdfbox/pdmodel/graphics/image/SampledImageReaderTest.java @@ -0,0 +1,128 @@ +package com.tom_roush.pdfbox.pdmodel.graphics.image; + +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.Bitmap; + +import java.io.InputStream; +import java.io.IOException; +import java.util.List; + +import com.tom_roush.pdfbox.cos.COSArray; +import com.tom_roush.pdfbox.cos.COSBase; +import com.tom_roush.pdfbox.filter.DecodeOptions; +import com.tom_roush.pdfbox.pdmodel.common.PDStream; +import com.tom_roush.pdfbox.pdmodel.graphics.color.PDColorSpace; + +import org.junit.Assert; +import org.junit.Test; + +public class SampledImageReaderTest +{ + private static PDImage createDummyPDImage(final int width, final int height) + { + return new PDImage() + { + @Override + public Bitmap getImage() throws IOException { return null; } + + @Override + public Bitmap getImage(Rect region, int subsampling) throws IOException { return null; } + + @Override + public Bitmap getStencilImage(Paint paint) throws IOException { return null; } + + @Override + public InputStream createInputStream() throws IOException { return null; } + + @Override + public InputStream createInputStream(DecodeOptions options) throws IOException { return null; } + + @Override + public InputStream createInputStream(List stopFilters) throws IOException { return null; } + + @Override + public boolean isEmpty() { return false; } + + @Override + public boolean isStencil() { return false; } + + @Override + public void setStencil(boolean isStencil) {} + + @Override + public int getBitsPerComponent() { return 8; } + + @Override + public void setBitsPerComponent(int bpc) {} + + @Override + public PDColorSpace getColorSpace() throws IOException { return null; } + + @Override + public void setColorSpace(PDColorSpace cs) {} + + @Override + public int getHeight() { return height; } + + @Override + public void setHeight(int h) {} + + @Override + public int getWidth() { return width; } + + @Override + public void setWidth(int w) {} + + @Override + public boolean getInterpolate() { return false; } + + @Override + public void setInterpolate(boolean value) {} + + @Override + public COSArray getDecode() { return null; } + + @Override + public void setDecode(COSArray decode) {} + + @Override + public String getSuffix() { return "png"; } + + @Override + public COSBase getCOSObject() { return null; } + }; + } + + @Test + public void testClipRegionNull() + { + PDImage pdImage = createDummyPDImage(400, 300); + + Rect clipped = SampledImageReader.clipRegion(pdImage, null); + Assert.assertNotNull(clipped); + Assert.assertEquals(0, clipped.left); + Assert.assertEquals(0, clipped.top); + Assert.assertEquals(400, clipped.right); + Assert.assertEquals(300, clipped.bottom); + } + + @Test + public void testClipRegionNonZeroOffset() + { + PDImage pdImage = createDummyPDImage(500, 500); + + // Rect(left, top, right, bottom) + Rect sourceRegion = new Rect(50, 60, 250, 360); + // sourceRegion width is 200, height is 300 + + Rect clipped = SampledImageReader.clipRegion(pdImage, sourceRegion); + Assert.assertNotNull(clipped); + Assert.assertEquals(50, clipped.left); + Assert.assertEquals(60, clipped.top); + // right must be left + width = 50 + 200 = 250 + Assert.assertEquals(250, clipped.right); + // bottom must be top + height = 60 + 300 = 360 + Assert.assertEquals(360, clipped.bottom); + } +} diff --git a/library/src/androidTest/java/com/tom_roush/pdfbox/pdmodel/graphics/image/ValidateXImage.java b/library/src/androidTest/java/com/tom_roush/pdfbox/pdmodel/graphics/image/ValidateXImage.java index 112b21ea5..1eb7ae33a 100644 --- a/library/src/androidTest/java/com/tom_roush/pdfbox/pdmodel/graphics/image/ValidateXImage.java +++ b/library/src/androidTest/java/com/tom_roush/pdfbox/pdmodel/graphics/image/ValidateXImage.java @@ -80,7 +80,7 @@ else if ("png".equals(format)) writeOk = ximage.getImage().compress(compressFormat, 100, new NullOutputStream()); assertTrue(writeOk); - writeOk = ximage.getOpaqueImage().compress(compressFormat, 100, + writeOk = ximage.getOpaqueImage(null, 1).compress(compressFormat, 100, new NullOutputStream()); assertTrue(writeOk); } diff --git a/library/src/androidTest/java/com/tom_roush/pdfbox/pdmodel/interactive/form/CombAlignmentTest.java b/library/src/androidTest/java/com/tom_roush/pdfbox/pdmodel/interactive/form/CombAlignmentTest.java index f3a25ee54..15d480320 100644 --- a/library/src/androidTest/java/com/tom_roush/pdfbox/pdmodel/interactive/form/CombAlignmentTest.java +++ b/library/src/androidTest/java/com/tom_roush/pdfbox/pdmodel/interactive/form/CombAlignmentTest.java @@ -59,10 +59,13 @@ public void testCombFields() throws IOException PDDocument document = PDDocument.load(testContext.getAssets().open(IN_DIR + "/" + NAME_OF_PDF)); PDAcroForm acroForm = document.getDocumentCatalog().getAcroForm(); PDField field = acroForm.getField("PDFBoxCombLeft"); + field.setValue(""); field.setValue(TEST_VALUE); field = acroForm.getField("PDFBoxCombMiddle"); + field.setValue(""); field.setValue(TEST_VALUE); field = acroForm.getField("PDFBoxCombRight"); + field.setValue(""); field.setValue(TEST_VALUE); // compare rendering File file = new File(OUT_DIR, NAME_OF_PDF); @@ -72,4 +75,28 @@ public void testCombFields() throws IOException testRendering.setUp(); testRendering.render(file); } + + // PDFBOX-5784 + @Test + public void testPDFBOX5784() throws IOException + { + final String NAME_OF_PDF = "PDFBOX-5784.pdf"; + + PDDocument document = PDDocument.load(testContext.getAssets().open(IN_DIR + "/" + NAME_OF_PDF)); + PDAcroForm acroForm = document.getDocumentCatalog().getAcroForm(); + for (PDField field : acroForm.getFieldTree()) + { + if (!field.getPartialName().contains("acrobat")) + { + field.setValue("WIaqg"); + } + } + // compare rendering + File file = new File(OUT_DIR, NAME_OF_PDF); + document.save(file); + document.close(); + TestRendering testRendering = new TestRendering(); + testRendering.setUp(); + testRendering.render(file); + } } diff --git a/library/src/androidTest/java/com/tom_roush/pdfbox/pdmodel/interactive/form/PDAcroFormFlattenTest.java b/library/src/androidTest/java/com/tom_roush/pdfbox/pdmodel/interactive/form/PDAcroFormFlattenTest.java index 7b3793f7a..89b336f0f 100644 --- a/library/src/androidTest/java/com/tom_roush/pdfbox/pdmodel/interactive/form/PDAcroFormFlattenTest.java +++ b/library/src/androidTest/java/com/tom_roush/pdfbox/pdmodel/interactive/form/PDAcroFormFlattenTest.java @@ -26,17 +26,22 @@ import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStream; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; import java.io.OutputStream; import java.net.URL; import com.tom_roush.pdfbox.android.PDFBoxResourceLoader; import com.tom_roush.pdfbox.pdmodel.PDDocument; +import com.tom_roush.pdfbox.pdmodel.interactive.form.PDAcroForm; import com.tom_roush.pdfbox.rendering.PDFRenderer; import com.tom_roush.pdfbox.rendering.TestRendering; import org.junit.Before; import org.junit.Test; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; /** @@ -281,12 +286,77 @@ public void testFlattenPDFBox4788() throws IOException * @throws IOException */ @Test - public void testFlattenPDFBox4889() throws IOException + public void flattenTestPDFBOX5254() throws IOException { String sourceUrl = "https://issues.apache.org/jira/secure/attachment/13005793/f1040sb%20test.pdf"; - String targetFileName = "PDFBOX-4889.pdf"; + String targetFileName = "PDFBOX-4889-5254.pdf"; - flattenAndCompare(sourceUrl, targetFileName); + generateSamples(sourceUrl, targetFileName); + + File inputFile = new File(IN_DIR, targetFileName); + File outputFile = new File(OUT_DIR, targetFileName); + + PDDocument testPdf = PDDocument.load(inputFile); + testPdf.getDocumentCatalog().getAcroForm().flatten(); + testPdf.setAllSecurityToBeRemoved(true); + testPdf.save(outputFile); + assertTrue(testPdf.getDocumentCatalog().getAcroForm().getFields().isEmpty()); + assertEquals(72, testPdf.getPage(0).getAnnotations().size()); + testPdf.close(); + + // compare rendering + TestRendering testRendering = new TestRendering(); + testRendering.setUp(); + testRendering.render(outputFile); + + removeAllRenditions(inputFile); + inputFile.delete(); + outputFile.delete(); + } + + /** + * Check that only VN_Name is removed in the field tree and in the annotations list. That field + * has an "orphan" widget that belongs to no page. + * + * @throws IOException + */ + @Test + public void flattenTestPDFBOX5225() throws IOException + { + String sourceUrl = "https://issues.apache.org/jira/secure/attachment/13027311/SourceFailure.pdf"; + String targetFileName = "PDFBOX-5225.pdf"; + + generateSamples(sourceUrl, targetFileName); + + File inputFile = new File(IN_DIR, targetFileName); + File outputFile = new File(OUT_DIR, targetFileName); + + PDDocument testPdf = PDDocument.load(inputFile); + PDAcroForm acroForm = testPdf.getDocumentCatalog().getAcroForm(); + List list = new ArrayList(); + list.add(acroForm.getField("VN_NAME")); + acroForm.flatten(list, false); + testPdf.setAllSecurityToBeRemoved(true); + testPdf.save(outputFile); + int count = 0; + Iterator iterator = acroForm.getFieldTree().iterator(); + while (iterator.hasNext()) + { + iterator.next(); + ++count; + } + assertEquals(76, count); + assertEquals(59, testPdf.getPage(0).getAnnotations().size()); + testPdf.close(); + + // compare rendering + TestRendering testRendering = new TestRendering(); + testRendering.setUp(); + testRendering.render(outputFile); + + removeAllRenditions(inputFile); + inputFile.delete(); + outputFile.delete(); } /** diff --git a/library/src/main/assets/com/tom_roush/fontbox/resources/unicode/Scripts.txt b/library/src/main/assets/com/tom_roush/fontbox/resources/unicode/Scripts.txt index a0bb2068a..0b3f717cb 100644 --- a/library/src/main/assets/com/tom_roush/fontbox/resources/unicode/Scripts.txt +++ b/library/src/main/assets/com/tom_roush/fontbox/resources/unicode/Scripts.txt @@ -1,2693 +1,3033 @@ -# Scripts-10.0.0.txt -# Date: 2017-03-11, 06:40:37 GMT -# © 2017 Unicode®, Inc. -# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# -# Unicode Character Database -# For documentation, see http://www.unicode.org/reports/tr44/ -# For more information, see: -# UAX #24, Unicode Script Property: http://www.unicode.org/reports/tr24/ -# Especially the sections: -# http://www.unicode.org/reports/tr24/#Assignment_Script_Values -# http://www.unicode.org/reports/tr24/#Assignment_ScriptX_Values -# - -# ================================================ - -# Property: Script - -# All code points not explicitly listed for Script -# have the value Unknown (Zzzz). - -# @missing: 0000..10FFFF; Unknown - -# ================================================ - -0000..001F ; Common # Cc [32] .. -0020 ; Common # Zs SPACE -0021..0023 ; Common # Po [3] EXCLAMATION MARK..NUMBER SIGN -0024 ; Common # Sc DOLLAR SIGN -0025..0027 ; Common # Po [3] PERCENT SIGN..APOSTROPHE -0028 ; Common # Ps LEFT PARENTHESIS -0029 ; Common # Pe RIGHT PARENTHESIS -002A ; Common # Po ASTERISK -002B ; Common # Sm PLUS SIGN -002C ; Common # Po COMMA -002D ; Common # Pd HYPHEN-MINUS -002E..002F ; Common # Po [2] FULL STOP..SOLIDUS -0030..0039 ; Common # Nd [10] DIGIT ZERO..DIGIT NINE -003A..003B ; Common # Po [2] COLON..SEMICOLON -003C..003E ; Common # Sm [3] LESS-THAN SIGN..GREATER-THAN SIGN -003F..0040 ; Common # Po [2] QUESTION MARK..COMMERCIAL AT -005B ; Common # Ps LEFT SQUARE BRACKET -005C ; Common # Po REVERSE SOLIDUS -005D ; Common # Pe RIGHT SQUARE BRACKET -005E ; Common # Sk CIRCUMFLEX ACCENT -005F ; Common # Pc LOW LINE -0060 ; Common # Sk GRAVE ACCENT -007B ; Common # Ps LEFT CURLY BRACKET -007C ; Common # Sm VERTICAL LINE -007D ; Common # Pe RIGHT CURLY BRACKET -007E ; Common # Sm TILDE -007F..009F ; Common # Cc [33] .. -00A0 ; Common # Zs NO-BREAK SPACE -00A1 ; Common # Po INVERTED EXCLAMATION MARK -00A2..00A5 ; Common # Sc [4] CENT SIGN..YEN SIGN -00A6 ; Common # So BROKEN BAR -00A7 ; Common # Po SECTION SIGN -00A8 ; Common # Sk DIAERESIS -00A9 ; Common # So COPYRIGHT SIGN -00AB ; Common # Pi LEFT-POINTING DOUBLE ANGLE QUOTATION MARK -00AC ; Common # Sm NOT SIGN -00AD ; Common # Cf SOFT HYPHEN -00AE ; Common # So REGISTERED SIGN -00AF ; Common # Sk MACRON -00B0 ; Common # So DEGREE SIGN -00B1 ; Common # Sm PLUS-MINUS SIGN -00B2..00B3 ; Common # No [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE -00B4 ; Common # Sk ACUTE ACCENT -00B5 ; Common # L& MICRO SIGN -00B6..00B7 ; Common # Po [2] PILCROW SIGN..MIDDLE DOT -00B8 ; Common # Sk CEDILLA -00B9 ; Common # No SUPERSCRIPT ONE -00BB ; Common # Pf RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -00BC..00BE ; Common # No [3] VULGAR FRACTION ONE QUARTER..VULGAR FRACTION THREE QUARTERS -00BF ; Common # Po INVERTED QUESTION MARK -00D7 ; Common # Sm MULTIPLICATION SIGN -00F7 ; Common # Sm DIVISION SIGN -02B9..02C1 ; Common # Lm [9] MODIFIER LETTER PRIME..MODIFIER LETTER REVERSED GLOTTAL STOP -02C2..02C5 ; Common # Sk [4] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD -02C6..02D1 ; Common # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON -02D2..02DF ; Common # Sk [14] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER CROSS ACCENT -02E5..02E9 ; Common # Sk [5] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER EXTRA-LOW TONE BAR -02EC ; Common # Lm MODIFIER LETTER VOICING -02ED ; Common # Sk MODIFIER LETTER UNASPIRATED -02EE ; Common # Lm MODIFIER LETTER DOUBLE APOSTROPHE -02EF..02FF ; Common # Sk [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW -0374 ; Common # Lm GREEK NUMERAL SIGN -037E ; Common # Po GREEK QUESTION MARK -0385 ; Common # Sk GREEK DIALYTIKA TONOS -0387 ; Common # Po GREEK ANO TELEIA -0589 ; Common # Po ARMENIAN FULL STOP -0605 ; Common # Cf ARABIC NUMBER MARK ABOVE -060C ; Common # Po ARABIC COMMA -061B ; Common # Po ARABIC SEMICOLON -061F ; Common # Po ARABIC QUESTION MARK -0640 ; Common # Lm ARABIC TATWEEL -06DD ; Common # Cf ARABIC END OF AYAH -08E2 ; Common # Cf ARABIC DISPUTED END OF AYAH -0964..0965 ; Common # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA -0E3F ; Common # Sc THAI CURRENCY SYMBOL BAHT -0FD5..0FD8 ; Common # So [4] RIGHT-FACING SVASTI SIGN..LEFT-FACING SVASTI SIGN WITH DOTS -10FB ; Common # Po GEORGIAN PARAGRAPH SEPARATOR -16EB..16ED ; Common # Po [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION -1735..1736 ; Common # Po [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION -1802..1803 ; Common # Po [2] MONGOLIAN COMMA..MONGOLIAN FULL STOP -1805 ; Common # Po MONGOLIAN FOUR DOTS -1CD3 ; Common # Po VEDIC SIGN NIHSHVASA -1CE1 ; Common # Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA -1CE9..1CEC ; Common # Lo [4] VEDIC SIGN ANUSVARA ANTARGOMUKHA..VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL -1CEE..1CF1 ; Common # Lo [4] VEDIC SIGN HEXIFORM LONG ANUSVARA..VEDIC SIGN ANUSVARA UBHAYATO MUKHA -1CF2..1CF3 ; Common # Mc [2] VEDIC SIGN ARDHAVISARGA..VEDIC SIGN ROTATED ARDHAVISARGA -1CF5..1CF6 ; Common # Lo [2] VEDIC SIGN JIHVAMULIYA..VEDIC SIGN UPADHMANIYA -1CF7 ; Common # Mc VEDIC SIGN ATIKRAMA -2000..200A ; Common # Zs [11] EN QUAD..HAIR SPACE -200B ; Common # Cf ZERO WIDTH SPACE -200E..200F ; Common # Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK -2010..2015 ; Common # Pd [6] HYPHEN..HORIZONTAL BAR -2016..2017 ; Common # Po [2] DOUBLE VERTICAL LINE..DOUBLE LOW LINE -2018 ; Common # Pi LEFT SINGLE QUOTATION MARK -2019 ; Common # Pf RIGHT SINGLE QUOTATION MARK -201A ; Common # Ps SINGLE LOW-9 QUOTATION MARK -201B..201C ; Common # Pi [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK -201D ; Common # Pf RIGHT DOUBLE QUOTATION MARK -201E ; Common # Ps DOUBLE LOW-9 QUOTATION MARK -201F ; Common # Pi DOUBLE HIGH-REVERSED-9 QUOTATION MARK -2020..2027 ; Common # Po [8] DAGGER..HYPHENATION POINT -2028 ; Common # Zl LINE SEPARATOR -2029 ; Common # Zp PARAGRAPH SEPARATOR -202A..202E ; Common # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE -202F ; Common # Zs NARROW NO-BREAK SPACE -2030..2038 ; Common # Po [9] PER MILLE SIGN..CARET -2039 ; Common # Pi SINGLE LEFT-POINTING ANGLE QUOTATION MARK -203A ; Common # Pf SINGLE RIGHT-POINTING ANGLE QUOTATION MARK -203B..203E ; Common # Po [4] REFERENCE MARK..OVERLINE -203F..2040 ; Common # Pc [2] UNDERTIE..CHARACTER TIE -2041..2043 ; Common # Po [3] CARET INSERTION POINT..HYPHEN BULLET -2044 ; Common # Sm FRACTION SLASH -2045 ; Common # Ps LEFT SQUARE BRACKET WITH QUILL -2046 ; Common # Pe RIGHT SQUARE BRACKET WITH QUILL -2047..2051 ; Common # Po [11] DOUBLE QUESTION MARK..TWO ASTERISKS ALIGNED VERTICALLY -2052 ; Common # Sm COMMERCIAL MINUS SIGN -2053 ; Common # Po SWUNG DASH -2054 ; Common # Pc INVERTED UNDERTIE -2055..205E ; Common # Po [10] FLOWER PUNCTUATION MARK..VERTICAL FOUR DOTS -205F ; Common # Zs MEDIUM MATHEMATICAL SPACE -2060..2064 ; Common # Cf [5] WORD JOINER..INVISIBLE PLUS -2066..206F ; Common # Cf [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES -2070 ; Common # No SUPERSCRIPT ZERO -2074..2079 ; Common # No [6] SUPERSCRIPT FOUR..SUPERSCRIPT NINE -207A..207C ; Common # Sm [3] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT EQUALS SIGN -207D ; Common # Ps SUPERSCRIPT LEFT PARENTHESIS -207E ; Common # Pe SUPERSCRIPT RIGHT PARENTHESIS -2080..2089 ; Common # No [10] SUBSCRIPT ZERO..SUBSCRIPT NINE -208A..208C ; Common # Sm [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN -208D ; Common # Ps SUBSCRIPT LEFT PARENTHESIS -208E ; Common # Pe SUBSCRIPT RIGHT PARENTHESIS -20A0..20BF ; Common # Sc [32] EURO-CURRENCY SIGN..BITCOIN SIGN -2100..2101 ; Common # So [2] ACCOUNT OF..ADDRESSED TO THE SUBJECT -2102 ; Common # L& DOUBLE-STRUCK CAPITAL C -2103..2106 ; Common # So [4] DEGREE CELSIUS..CADA UNA -2107 ; Common # L& EULER CONSTANT -2108..2109 ; Common # So [2] SCRUPLE..DEGREE FAHRENHEIT -210A..2113 ; Common # L& [10] SCRIPT SMALL G..SCRIPT SMALL L -2114 ; Common # So L B BAR SYMBOL -2115 ; Common # L& DOUBLE-STRUCK CAPITAL N -2116..2117 ; Common # So [2] NUMERO SIGN..SOUND RECORDING COPYRIGHT -2118 ; Common # Sm SCRIPT CAPITAL P -2119..211D ; Common # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R -211E..2123 ; Common # So [6] PRESCRIPTION TAKE..VERSICLE -2124 ; Common # L& DOUBLE-STRUCK CAPITAL Z -2125 ; Common # So OUNCE SIGN -2127 ; Common # So INVERTED OHM SIGN -2128 ; Common # L& BLACK-LETTER CAPITAL Z -2129 ; Common # So TURNED GREEK SMALL LETTER IOTA -212C..212D ; Common # L& [2] SCRIPT CAPITAL B..BLACK-LETTER CAPITAL C -212E ; Common # So ESTIMATED SYMBOL -212F..2131 ; Common # L& [3] SCRIPT SMALL E..SCRIPT CAPITAL F -2133..2134 ; Common # L& [2] SCRIPT CAPITAL M..SCRIPT SMALL O -2135..2138 ; Common # Lo [4] ALEF SYMBOL..DALET SYMBOL -2139 ; Common # L& INFORMATION SOURCE -213A..213B ; Common # So [2] ROTATED CAPITAL Q..FACSIMILE SIGN -213C..213F ; Common # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI -2140..2144 ; Common # Sm [5] DOUBLE-STRUCK N-ARY SUMMATION..TURNED SANS-SERIF CAPITAL Y -2145..2149 ; Common # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J -214A ; Common # So PROPERTY LINE -214B ; Common # Sm TURNED AMPERSAND -214C..214D ; Common # So [2] PER SIGN..AKTIESELSKAB -214F ; Common # So SYMBOL FOR SAMARITAN SOURCE -2150..215F ; Common # No [16] VULGAR FRACTION ONE SEVENTH..FRACTION NUMERATOR ONE -2189 ; Common # No VULGAR FRACTION ZERO THIRDS -218A..218B ; Common # So [2] TURNED DIGIT TWO..TURNED DIGIT THREE -2190..2194 ; Common # Sm [5] LEFTWARDS ARROW..LEFT RIGHT ARROW -2195..2199 ; Common # So [5] UP DOWN ARROW..SOUTH WEST ARROW -219A..219B ; Common # Sm [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE -219C..219F ; Common # So [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW -21A0 ; Common # Sm RIGHTWARDS TWO HEADED ARROW -21A1..21A2 ; Common # So [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL -21A3 ; Common # Sm RIGHTWARDS ARROW WITH TAIL -21A4..21A5 ; Common # So [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR -21A6 ; Common # Sm RIGHTWARDS ARROW FROM BAR -21A7..21AD ; Common # So [7] DOWNWARDS ARROW FROM BAR..LEFT RIGHT WAVE ARROW -21AE ; Common # Sm LEFT RIGHT ARROW WITH STROKE -21AF..21CD ; Common # So [31] DOWNWARDS ZIGZAG ARROW..LEFTWARDS DOUBLE ARROW WITH STROKE -21CE..21CF ; Common # Sm [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE -21D0..21D1 ; Common # So [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW -21D2 ; Common # Sm RIGHTWARDS DOUBLE ARROW -21D3 ; Common # So DOWNWARDS DOUBLE ARROW -21D4 ; Common # Sm LEFT RIGHT DOUBLE ARROW -21D5..21F3 ; Common # So [31] UP DOWN DOUBLE ARROW..UP DOWN WHITE ARROW -21F4..22FF ; Common # Sm [268] RIGHT ARROW WITH SMALL CIRCLE..Z NOTATION BAG MEMBERSHIP -2300..2307 ; Common # So [8] DIAMETER SIGN..WAVY LINE -2308 ; Common # Ps LEFT CEILING -2309 ; Common # Pe RIGHT CEILING -230A ; Common # Ps LEFT FLOOR -230B ; Common # Pe RIGHT FLOOR -230C..231F ; Common # So [20] BOTTOM RIGHT CROP..BOTTOM RIGHT CORNER -2320..2321 ; Common # Sm [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL -2322..2328 ; Common # So [7] FROWN..KEYBOARD -2329 ; Common # Ps LEFT-POINTING ANGLE BRACKET -232A ; Common # Pe RIGHT-POINTING ANGLE BRACKET -232B..237B ; Common # So [81] ERASE TO THE LEFT..NOT CHECK MARK -237C ; Common # Sm RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW -237D..239A ; Common # So [30] SHOULDERED OPEN BOX..CLEAR SCREEN SYMBOL -239B..23B3 ; Common # Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM -23B4..23DB ; Common # So [40] TOP SQUARE BRACKET..FUSE -23DC..23E1 ; Common # Sm [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET -23E2..2426 ; Common # So [69] WHITE TRAPEZIUM..SYMBOL FOR SUBSTITUTE FORM TWO -2440..244A ; Common # So [11] OCR HOOK..OCR DOUBLE BACKSLASH -2460..249B ; Common # No [60] CIRCLED DIGIT ONE..NUMBER TWENTY FULL STOP -249C..24E9 ; Common # So [78] PARENTHESIZED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z -24EA..24FF ; Common # No [22] CIRCLED DIGIT ZERO..NEGATIVE CIRCLED DIGIT ZERO -2500..25B6 ; Common # So [183] BOX DRAWINGS LIGHT HORIZONTAL..BLACK RIGHT-POINTING TRIANGLE -25B7 ; Common # Sm WHITE RIGHT-POINTING TRIANGLE -25B8..25C0 ; Common # So [9] BLACK RIGHT-POINTING SMALL TRIANGLE..BLACK LEFT-POINTING TRIANGLE -25C1 ; Common # Sm WHITE LEFT-POINTING TRIANGLE -25C2..25F7 ; Common # So [54] BLACK LEFT-POINTING SMALL TRIANGLE..WHITE CIRCLE WITH UPPER RIGHT QUADRANT -25F8..25FF ; Common # Sm [8] UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE -2600..266E ; Common # So [111] BLACK SUN WITH RAYS..MUSIC NATURAL SIGN -266F ; Common # Sm MUSIC SHARP SIGN -2670..2767 ; Common # So [248] WEST SYRIAC CROSS..ROTATED FLORAL HEART BULLET -2768 ; Common # Ps MEDIUM LEFT PARENTHESIS ORNAMENT -2769 ; Common # Pe MEDIUM RIGHT PARENTHESIS ORNAMENT -276A ; Common # Ps MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT -276B ; Common # Pe MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT -276C ; Common # Ps MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT -276D ; Common # Pe MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT -276E ; Common # Ps HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT -276F ; Common # Pe HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT -2770 ; Common # Ps HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT -2771 ; Common # Pe HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT -2772 ; Common # Ps LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT -2773 ; Common # Pe LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT -2774 ; Common # Ps MEDIUM LEFT CURLY BRACKET ORNAMENT -2775 ; Common # Pe MEDIUM RIGHT CURLY BRACKET ORNAMENT -2776..2793 ; Common # No [30] DINGBAT NEGATIVE CIRCLED DIGIT ONE..DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN -2794..27BF ; Common # So [44] HEAVY WIDE-HEADED RIGHTWARDS ARROW..DOUBLE CURLY LOOP -27C0..27C4 ; Common # Sm [5] THREE DIMENSIONAL ANGLE..OPEN SUPERSET -27C5 ; Common # Ps LEFT S-SHAPED BAG DELIMITER -27C6 ; Common # Pe RIGHT S-SHAPED BAG DELIMITER -27C7..27E5 ; Common # Sm [31] OR WITH DOT INSIDE..WHITE SQUARE WITH RIGHTWARDS TICK -27E6 ; Common # Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET -27E7 ; Common # Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET -27E8 ; Common # Ps MATHEMATICAL LEFT ANGLE BRACKET -27E9 ; Common # Pe MATHEMATICAL RIGHT ANGLE BRACKET -27EA ; Common # Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET -27EB ; Common # Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET -27EC ; Common # Ps MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET -27ED ; Common # Pe MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET -27EE ; Common # Ps MATHEMATICAL LEFT FLATTENED PARENTHESIS -27EF ; Common # Pe MATHEMATICAL RIGHT FLATTENED PARENTHESIS -27F0..27FF ; Common # Sm [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW -2900..2982 ; Common # Sm [131] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..Z NOTATION TYPE COLON -2983 ; Common # Ps LEFT WHITE CURLY BRACKET -2984 ; Common # Pe RIGHT WHITE CURLY BRACKET -2985 ; Common # Ps LEFT WHITE PARENTHESIS -2986 ; Common # Pe RIGHT WHITE PARENTHESIS -2987 ; Common # Ps Z NOTATION LEFT IMAGE BRACKET -2988 ; Common # Pe Z NOTATION RIGHT IMAGE BRACKET -2989 ; Common # Ps Z NOTATION LEFT BINDING BRACKET -298A ; Common # Pe Z NOTATION RIGHT BINDING BRACKET -298B ; Common # Ps LEFT SQUARE BRACKET WITH UNDERBAR -298C ; Common # Pe RIGHT SQUARE BRACKET WITH UNDERBAR -298D ; Common # Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER -298E ; Common # Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER -298F ; Common # Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER -2990 ; Common # Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER -2991 ; Common # Ps LEFT ANGLE BRACKET WITH DOT -2992 ; Common # Pe RIGHT ANGLE BRACKET WITH DOT -2993 ; Common # Ps LEFT ARC LESS-THAN BRACKET -2994 ; Common # Pe RIGHT ARC GREATER-THAN BRACKET -2995 ; Common # Ps DOUBLE LEFT ARC GREATER-THAN BRACKET -2996 ; Common # Pe DOUBLE RIGHT ARC LESS-THAN BRACKET -2997 ; Common # Ps LEFT BLACK TORTOISE SHELL BRACKET -2998 ; Common # Pe RIGHT BLACK TORTOISE SHELL BRACKET -2999..29D7 ; Common # Sm [63] DOTTED FENCE..BLACK HOURGLASS -29D8 ; Common # Ps LEFT WIGGLY FENCE -29D9 ; Common # Pe RIGHT WIGGLY FENCE -29DA ; Common # Ps LEFT DOUBLE WIGGLY FENCE -29DB ; Common # Pe RIGHT DOUBLE WIGGLY FENCE -29DC..29FB ; Common # Sm [32] INCOMPLETE INFINITY..TRIPLE PLUS -29FC ; Common # Ps LEFT-POINTING CURVED ANGLE BRACKET -29FD ; Common # Pe RIGHT-POINTING CURVED ANGLE BRACKET -29FE..2AFF ; Common # Sm [258] TINY..N-ARY WHITE VERTICAL BAR -2B00..2B2F ; Common # So [48] NORTH EAST WHITE ARROW..WHITE VERTICAL ELLIPSE -2B30..2B44 ; Common # Sm [21] LEFT ARROW WITH SMALL CIRCLE..RIGHTWARDS ARROW THROUGH SUPERSET -2B45..2B46 ; Common # So [2] LEFTWARDS QUADRUPLE ARROW..RIGHTWARDS QUADRUPLE ARROW -2B47..2B4C ; Common # Sm [6] REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW..RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR -2B4D..2B73 ; Common # So [39] DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW..DOWNWARDS TRIANGLE-HEADED ARROW TO BAR -2B76..2B95 ; Common # So [32] NORTH WEST TRIANGLE-HEADED ARROW TO BAR..RIGHTWARDS BLACK ARROW -2B98..2BB9 ; Common # So [34] THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD..UP ARROWHEAD IN A RECTANGLE BOX -2BBD..2BC8 ; Common # So [12] BALLOT BOX WITH LIGHT X..BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED -2BCA..2BD2 ; Common # So [9] TOP HALF BLACK CIRCLE..GROUP MARK -2BEC..2BEF ; Common # So [4] LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS..DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS -2E00..2E01 ; Common # Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER -2E02 ; Common # Pi LEFT SUBSTITUTION BRACKET -2E03 ; Common # Pf RIGHT SUBSTITUTION BRACKET -2E04 ; Common # Pi LEFT DOTTED SUBSTITUTION BRACKET -2E05 ; Common # Pf RIGHT DOTTED SUBSTITUTION BRACKET -2E06..2E08 ; Common # Po [3] RAISED INTERPOLATION MARKER..DOTTED TRANSPOSITION MARKER -2E09 ; Common # Pi LEFT TRANSPOSITION BRACKET -2E0A ; Common # Pf RIGHT TRANSPOSITION BRACKET -2E0B ; Common # Po RAISED SQUARE -2E0C ; Common # Pi LEFT RAISED OMISSION BRACKET -2E0D ; Common # Pf RIGHT RAISED OMISSION BRACKET -2E0E..2E16 ; Common # Po [9] EDITORIAL CORONIS..DOTTED RIGHT-POINTING ANGLE -2E17 ; Common # Pd DOUBLE OBLIQUE HYPHEN -2E18..2E19 ; Common # Po [2] INVERTED INTERROBANG..PALM BRANCH -2E1A ; Common # Pd HYPHEN WITH DIAERESIS -2E1B ; Common # Po TILDE WITH RING ABOVE -2E1C ; Common # Pi LEFT LOW PARAPHRASE BRACKET -2E1D ; Common # Pf RIGHT LOW PARAPHRASE BRACKET -2E1E..2E1F ; Common # Po [2] TILDE WITH DOT ABOVE..TILDE WITH DOT BELOW -2E20 ; Common # Pi LEFT VERTICAL BAR WITH QUILL -2E21 ; Common # Pf RIGHT VERTICAL BAR WITH QUILL -2E22 ; Common # Ps TOP LEFT HALF BRACKET -2E23 ; Common # Pe TOP RIGHT HALF BRACKET -2E24 ; Common # Ps BOTTOM LEFT HALF BRACKET -2E25 ; Common # Pe BOTTOM RIGHT HALF BRACKET -2E26 ; Common # Ps LEFT SIDEWAYS U BRACKET -2E27 ; Common # Pe RIGHT SIDEWAYS U BRACKET -2E28 ; Common # Ps LEFT DOUBLE PARENTHESIS -2E29 ; Common # Pe RIGHT DOUBLE PARENTHESIS -2E2A..2E2E ; Common # Po [5] TWO DOTS OVER ONE DOT PUNCTUATION..REVERSED QUESTION MARK -2E2F ; Common # Lm VERTICAL TILDE -2E30..2E39 ; Common # Po [10] RING POINT..TOP HALF SECTION SIGN -2E3A..2E3B ; Common # Pd [2] TWO-EM DASH..THREE-EM DASH -2E3C..2E3F ; Common # Po [4] STENOGRAPHIC FULL STOP..CAPITULUM -2E40 ; Common # Pd DOUBLE HYPHEN -2E41 ; Common # Po REVERSED COMMA -2E42 ; Common # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK -2E43..2E49 ; Common # Po [7] DASH WITH LEFT UPTURN..DOUBLE STACKED COMMA -2FF0..2FFB ; Common # So [12] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID -3000 ; Common # Zs IDEOGRAPHIC SPACE -3001..3003 ; Common # Po [3] IDEOGRAPHIC COMMA..DITTO MARK -3004 ; Common # So JAPANESE INDUSTRIAL STANDARD SYMBOL -3006 ; Common # Lo IDEOGRAPHIC CLOSING MARK -3008 ; Common # Ps LEFT ANGLE BRACKET -3009 ; Common # Pe RIGHT ANGLE BRACKET -300A ; Common # Ps LEFT DOUBLE ANGLE BRACKET -300B ; Common # Pe RIGHT DOUBLE ANGLE BRACKET -300C ; Common # Ps LEFT CORNER BRACKET -300D ; Common # Pe RIGHT CORNER BRACKET -300E ; Common # Ps LEFT WHITE CORNER BRACKET -300F ; Common # Pe RIGHT WHITE CORNER BRACKET -3010 ; Common # Ps LEFT BLACK LENTICULAR BRACKET -3011 ; Common # Pe RIGHT BLACK LENTICULAR BRACKET -3012..3013 ; Common # So [2] POSTAL MARK..GETA MARK -3014 ; Common # Ps LEFT TORTOISE SHELL BRACKET -3015 ; Common # Pe RIGHT TORTOISE SHELL BRACKET -3016 ; Common # Ps LEFT WHITE LENTICULAR BRACKET -3017 ; Common # Pe RIGHT WHITE LENTICULAR BRACKET -3018 ; Common # Ps LEFT WHITE TORTOISE SHELL BRACKET -3019 ; Common # Pe RIGHT WHITE TORTOISE SHELL BRACKET -301A ; Common # Ps LEFT WHITE SQUARE BRACKET -301B ; Common # Pe RIGHT WHITE SQUARE BRACKET -301C ; Common # Pd WAVE DASH -301D ; Common # Ps REVERSED DOUBLE PRIME QUOTATION MARK -301E..301F ; Common # Pe [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK -3020 ; Common # So POSTAL MARK FACE -3030 ; Common # Pd WAVY DASH -3031..3035 ; Common # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF -3036..3037 ; Common # So [2] CIRCLED POSTAL MARK..IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL -303C ; Common # Lo MASU MARK -303D ; Common # Po PART ALTERNATION MARK -303E..303F ; Common # So [2] IDEOGRAPHIC VARIATION INDICATOR..IDEOGRAPHIC HALF FILL SPACE -309B..309C ; Common # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK -30A0 ; Common # Pd KATAKANA-HIRAGANA DOUBLE HYPHEN -30FB ; Common # Po KATAKANA MIDDLE DOT -30FC ; Common # Lm KATAKANA-HIRAGANA PROLONGED SOUND MARK -3190..3191 ; Common # So [2] IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION REVERSE MARK -3192..3195 ; Common # No [4] IDEOGRAPHIC ANNOTATION ONE MARK..IDEOGRAPHIC ANNOTATION FOUR MARK -3196..319F ; Common # So [10] IDEOGRAPHIC ANNOTATION TOP MARK..IDEOGRAPHIC ANNOTATION MAN MARK -31C0..31E3 ; Common # So [36] CJK STROKE T..CJK STROKE Q -3220..3229 ; Common # No [10] PARENTHESIZED IDEOGRAPH ONE..PARENTHESIZED IDEOGRAPH TEN -322A..3247 ; Common # So [30] PARENTHESIZED IDEOGRAPH MOON..CIRCLED IDEOGRAPH KOTO -3248..324F ; Common # No [8] CIRCLED NUMBER TEN ON BLACK SQUARE..CIRCLED NUMBER EIGHTY ON BLACK SQUARE -3250 ; Common # So PARTNERSHIP SIGN -3251..325F ; Common # No [15] CIRCLED NUMBER TWENTY ONE..CIRCLED NUMBER THIRTY FIVE -327F ; Common # So KOREAN STANDARD SYMBOL -3280..3289 ; Common # No [10] CIRCLED IDEOGRAPH ONE..CIRCLED IDEOGRAPH TEN -328A..32B0 ; Common # So [39] CIRCLED IDEOGRAPH MOON..CIRCLED IDEOGRAPH NIGHT -32B1..32BF ; Common # No [15] CIRCLED NUMBER THIRTY SIX..CIRCLED NUMBER FIFTY -32C0..32CF ; Common # So [16] IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY..LIMITED LIABILITY SIGN -3358..33FF ; Common # So [168] IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO..SQUARE GAL -4DC0..4DFF ; Common # So [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION -A700..A716 ; Common # Sk [23] MODIFIER LETTER CHINESE TONE YIN PING..MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR -A717..A71F ; Common # Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK -A720..A721 ; Common # Sk [2] MODIFIER LETTER STRESS AND HIGH TONE..MODIFIER LETTER STRESS AND LOW TONE -A788 ; Common # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT -A789..A78A ; Common # Sk [2] MODIFIER LETTER COLON..MODIFIER LETTER SHORT EQUALS SIGN -A830..A835 ; Common # No [6] NORTH INDIC FRACTION ONE QUARTER..NORTH INDIC FRACTION THREE SIXTEENTHS -A836..A837 ; Common # So [2] NORTH INDIC QUARTER MARK..NORTH INDIC PLACEHOLDER MARK -A838 ; Common # Sc NORTH INDIC RUPEE MARK -A839 ; Common # So NORTH INDIC QUANTITY MARK -A92E ; Common # Po KAYAH LI SIGN CWI -A9CF ; Common # Lm JAVANESE PANGRANGKEP -AB5B ; Common # Sk MODIFIER BREVE WITH INVERTED BREVE -FD3E ; Common # Pe ORNATE LEFT PARENTHESIS -FD3F ; Common # Ps ORNATE RIGHT PARENTHESIS -FE10..FE16 ; Common # Po [7] PRESENTATION FORM FOR VERTICAL COMMA..PRESENTATION FORM FOR VERTICAL QUESTION MARK -FE17 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET -FE18 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET -FE19 ; Common # Po PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS -FE30 ; Common # Po PRESENTATION FORM FOR VERTICAL TWO DOT LEADER -FE31..FE32 ; Common # Pd [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH -FE33..FE34 ; Common # Pc [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE -FE35 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS -FE36 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS -FE37 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET -FE38 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET -FE39 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET -FE3A ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET -FE3B ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET -FE3C ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET -FE3D ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET -FE3E ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET -FE3F ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET -FE40 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET -FE41 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET -FE42 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET -FE43 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET -FE44 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET -FE45..FE46 ; Common # Po [2] SESAME DOT..WHITE SESAME DOT -FE47 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET -FE48 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET -FE49..FE4C ; Common # Po [4] DASHED OVERLINE..DOUBLE WAVY OVERLINE -FE4D..FE4F ; Common # Pc [3] DASHED LOW LINE..WAVY LOW LINE -FE50..FE52 ; Common # Po [3] SMALL COMMA..SMALL FULL STOP -FE54..FE57 ; Common # Po [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK -FE58 ; Common # Pd SMALL EM DASH -FE59 ; Common # Ps SMALL LEFT PARENTHESIS -FE5A ; Common # Pe SMALL RIGHT PARENTHESIS -FE5B ; Common # Ps SMALL LEFT CURLY BRACKET -FE5C ; Common # Pe SMALL RIGHT CURLY BRACKET -FE5D ; Common # Ps SMALL LEFT TORTOISE SHELL BRACKET -FE5E ; Common # Pe SMALL RIGHT TORTOISE SHELL BRACKET -FE5F..FE61 ; Common # Po [3] SMALL NUMBER SIGN..SMALL ASTERISK -FE62 ; Common # Sm SMALL PLUS SIGN -FE63 ; Common # Pd SMALL HYPHEN-MINUS -FE64..FE66 ; Common # Sm [3] SMALL LESS-THAN SIGN..SMALL EQUALS SIGN -FE68 ; Common # Po SMALL REVERSE SOLIDUS -FE69 ; Common # Sc SMALL DOLLAR SIGN -FE6A..FE6B ; Common # Po [2] SMALL PERCENT SIGN..SMALL COMMERCIAL AT -FEFF ; Common # Cf ZERO WIDTH NO-BREAK SPACE -FF01..FF03 ; Common # Po [3] FULLWIDTH EXCLAMATION MARK..FULLWIDTH NUMBER SIGN -FF04 ; Common # Sc FULLWIDTH DOLLAR SIGN -FF05..FF07 ; Common # Po [3] FULLWIDTH PERCENT SIGN..FULLWIDTH APOSTROPHE -FF08 ; Common # Ps FULLWIDTH LEFT PARENTHESIS -FF09 ; Common # Pe FULLWIDTH RIGHT PARENTHESIS -FF0A ; Common # Po FULLWIDTH ASTERISK -FF0B ; Common # Sm FULLWIDTH PLUS SIGN -FF0C ; Common # Po FULLWIDTH COMMA -FF0D ; Common # Pd FULLWIDTH HYPHEN-MINUS -FF0E..FF0F ; Common # Po [2] FULLWIDTH FULL STOP..FULLWIDTH SOLIDUS -FF10..FF19 ; Common # Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE -FF1A..FF1B ; Common # Po [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON -FF1C..FF1E ; Common # Sm [3] FULLWIDTH LESS-THAN SIGN..FULLWIDTH GREATER-THAN SIGN -FF1F..FF20 ; Common # Po [2] FULLWIDTH QUESTION MARK..FULLWIDTH COMMERCIAL AT -FF3B ; Common # Ps FULLWIDTH LEFT SQUARE BRACKET -FF3C ; Common # Po FULLWIDTH REVERSE SOLIDUS -FF3D ; Common # Pe FULLWIDTH RIGHT SQUARE BRACKET -FF3E ; Common # Sk FULLWIDTH CIRCUMFLEX ACCENT -FF3F ; Common # Pc FULLWIDTH LOW LINE -FF40 ; Common # Sk FULLWIDTH GRAVE ACCENT -FF5B ; Common # Ps FULLWIDTH LEFT CURLY BRACKET -FF5C ; Common # Sm FULLWIDTH VERTICAL LINE -FF5D ; Common # Pe FULLWIDTH RIGHT CURLY BRACKET -FF5E ; Common # Sm FULLWIDTH TILDE -FF5F ; Common # Ps FULLWIDTH LEFT WHITE PARENTHESIS -FF60 ; Common # Pe FULLWIDTH RIGHT WHITE PARENTHESIS -FF61 ; Common # Po HALFWIDTH IDEOGRAPHIC FULL STOP -FF62 ; Common # Ps HALFWIDTH LEFT CORNER BRACKET -FF63 ; Common # Pe HALFWIDTH RIGHT CORNER BRACKET -FF64..FF65 ; Common # Po [2] HALFWIDTH IDEOGRAPHIC COMMA..HALFWIDTH KATAKANA MIDDLE DOT -FF70 ; Common # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK -FF9E..FF9F ; Common # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK -FFE0..FFE1 ; Common # Sc [2] FULLWIDTH CENT SIGN..FULLWIDTH POUND SIGN -FFE2 ; Common # Sm FULLWIDTH NOT SIGN -FFE3 ; Common # Sk FULLWIDTH MACRON -FFE4 ; Common # So FULLWIDTH BROKEN BAR -FFE5..FFE6 ; Common # Sc [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN -FFE8 ; Common # So HALFWIDTH FORMS LIGHT VERTICAL -FFE9..FFEC ; Common # Sm [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW -FFED..FFEE ; Common # So [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE -FFF9..FFFB ; Common # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR -FFFC..FFFD ; Common # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTER -10100..10102 ; Common # Po [3] AEGEAN WORD SEPARATOR LINE..AEGEAN CHECK MARK -10107..10133 ; Common # No [45] AEGEAN NUMBER ONE..AEGEAN NUMBER NINETY THOUSAND -10137..1013F ; Common # So [9] AEGEAN WEIGHT BASE UNIT..AEGEAN MEASURE THIRD SUBUNIT -10190..1019B ; Common # So [12] ROMAN SEXTANS SIGN..ROMAN CENTURIAL SIGN -101D0..101FC ; Common # So [45] PHAISTOS DISC SIGN PEDESTRIAN..PHAISTOS DISC SIGN WAVY BAND -102E1..102FB ; Common # No [27] COPTIC EPACT DIGIT ONE..COPTIC EPACT NUMBER NINE HUNDRED -1BCA0..1BCA3 ; Common # Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP -1D000..1D0F5 ; Common # So [246] BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO -1D100..1D126 ; Common # So [39] MUSICAL SYMBOL SINGLE BARLINE..MUSICAL SYMBOL DRUM CLEF-2 -1D129..1D164 ; Common # So [60] MUSICAL SYMBOL MULTIPLE MEASURE REST..MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE -1D165..1D166 ; Common # Mc [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM -1D16A..1D16C ; Common # So [3] MUSICAL SYMBOL FINGERED TREMOLO-1..MUSICAL SYMBOL FINGERED TREMOLO-3 -1D16D..1D172 ; Common # Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5 -1D173..1D17A ; Common # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE -1D183..1D184 ; Common # So [2] MUSICAL SYMBOL ARPEGGIATO UP..MUSICAL SYMBOL ARPEGGIATO DOWN -1D18C..1D1A9 ; Common # So [30] MUSICAL SYMBOL RINFORZANDO..MUSICAL SYMBOL DEGREE SLASH -1D1AE..1D1E8 ; Common # So [59] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL KIEVAN FLAT SIGN -1D300..1D356 ; Common # So [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING -1D360..1D371 ; Common # No [18] COUNTING ROD UNIT DIGIT ONE..COUNTING ROD TENS DIGIT NINE -1D400..1D454 ; Common # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G -1D456..1D49C ; Common # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A -1D49E..1D49F ; Common # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D -1D4A2 ; Common # L& MATHEMATICAL SCRIPT CAPITAL G -1D4A5..1D4A6 ; Common # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K -1D4A9..1D4AC ; Common # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q -1D4AE..1D4B9 ; Common # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D -1D4BB ; Common # L& MATHEMATICAL SCRIPT SMALL F -1D4BD..1D4C3 ; Common # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N -1D4C5..1D505 ; Common # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B -1D507..1D50A ; Common # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G -1D50D..1D514 ; Common # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q -1D516..1D51C ; Common # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y -1D51E..1D539 ; Common # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B -1D53B..1D53E ; Common # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G -1D540..1D544 ; Common # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M -1D546 ; Common # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O -1D54A..1D550 ; Common # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y -1D552..1D6A5 ; Common # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J -1D6A8..1D6C0 ; Common # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA -1D6C1 ; Common # Sm MATHEMATICAL BOLD NABLA -1D6C2..1D6DA ; Common # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA -1D6DB ; Common # Sm MATHEMATICAL BOLD PARTIAL DIFFERENTIAL -1D6DC..1D6FA ; Common # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA -1D6FB ; Common # Sm MATHEMATICAL ITALIC NABLA -1D6FC..1D714 ; Common # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA -1D715 ; Common # Sm MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL -1D716..1D734 ; Common # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA -1D735 ; Common # Sm MATHEMATICAL BOLD ITALIC NABLA -1D736..1D74E ; Common # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA -1D74F ; Common # Sm MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL -1D750..1D76E ; Common # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA -1D76F ; Common # Sm MATHEMATICAL SANS-SERIF BOLD NABLA -1D770..1D788 ; Common # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA -1D789 ; Common # Sm MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL -1D78A..1D7A8 ; Common # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA -1D7A9 ; Common # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA -1D7AA..1D7C2 ; Common # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA -1D7C3 ; Common # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL -1D7C4..1D7CB ; Common # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA -1D7CE..1D7FF ; Common # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE -1F000..1F02B ; Common # So [44] MAHJONG TILE EAST WIND..MAHJONG TILE BACK -1F030..1F093 ; Common # So [100] DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06 -1F0A0..1F0AE ; Common # So [15] PLAYING CARD BACK..PLAYING CARD KING OF SPADES -1F0B1..1F0BF ; Common # So [15] PLAYING CARD ACE OF HEARTS..PLAYING CARD RED JOKER -1F0C1..1F0CF ; Common # So [15] PLAYING CARD ACE OF DIAMONDS..PLAYING CARD BLACK JOKER -1F0D1..1F0F5 ; Common # So [37] PLAYING CARD ACE OF CLUBS..PLAYING CARD TRUMP-21 -1F100..1F10C ; Common # No [13] DIGIT ZERO FULL STOP..DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO -1F110..1F12E ; Common # So [31] PARENTHESIZED LATIN CAPITAL LETTER A..CIRCLED WZ -1F130..1F16B ; Common # So [60] SQUARED LATIN CAPITAL LETTER A..RAISED MD SIGN -1F170..1F1AC ; Common # So [61] NEGATIVE SQUARED LATIN CAPITAL LETTER A..SQUARED VOD -1F1E6..1F1FF ; Common # So [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z -1F201..1F202 ; Common # So [2] SQUARED KATAKANA KOKO..SQUARED KATAKANA SA -1F210..1F23B ; Common # So [44] SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-914D -1F240..1F248 ; Common # So [9] TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C..TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 -1F250..1F251 ; Common # So [2] CIRCLED IDEOGRAPH ADVANTAGE..CIRCLED IDEOGRAPH ACCEPT -1F260..1F265 ; Common # So [6] ROUNDED SYMBOL FOR FU..ROUNDED SYMBOL FOR CAI -1F300..1F3FA ; Common # So [251] CYCLONE..AMPHORA -1F3FB..1F3FF ; Common # Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6 -1F400..1F6D4 ; Common # So [725] RAT..PAGODA -1F6E0..1F6EC ; Common # So [13] HAMMER AND WRENCH..AIRPLANE ARRIVING -1F6F0..1F6F8 ; Common # So [9] SATELLITE..FLYING SAUCER -1F700..1F773 ; Common # So [116] ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE -1F780..1F7D4 ; Common # So [85] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..HEAVY TWELVE POINTED PINWHEEL STAR -1F800..1F80B ; Common # So [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD -1F810..1F847 ; Common # So [56] LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD..DOWNWARDS HEAVY ARROW -1F850..1F859 ; Common # So [10] LEFTWARDS SANS-SERIF ARROW..UP DOWN SANS-SERIF ARROW -1F860..1F887 ; Common # So [40] WIDE-HEADED LEFTWARDS LIGHT BARB ARROW..WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW -1F890..1F8AD ; Common # So [30] LEFTWARDS TRIANGLE ARROWHEAD..WHITE ARROW SHAFT WIDTH TWO THIRDS -1F900..1F90B ; Common # So [12] CIRCLED CROSS FORMEE WITH FOUR DOTS..DOWNWARD FACING NOTCHED HOOK WITH DOT -1F910..1F93E ; Common # So [47] ZIPPER-MOUTH FACE..HANDBALL -1F940..1F94C ; Common # So [13] WILTED FLOWER..CURLING STONE -1F950..1F96B ; Common # So [28] CROISSANT..CANNED FOOD -1F980..1F997 ; Common # So [24] CRAB..CRICKET -1F9C0 ; Common # So CHEESE WEDGE -1F9D0..1F9E6 ; Common # So [23] FACE WITH MONOCLE..SOCKS -E0001 ; Common # Cf LANGUAGE TAG -E0020..E007F ; Common # Cf [96] TAG SPACE..CANCEL TAG - -# Total code points: 7363 - -# ================================================ - -0041..005A ; Latin # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z -0061..007A ; Latin # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z -00AA ; Latin # Lo FEMININE ORDINAL INDICATOR -00BA ; Latin # Lo MASCULINE ORDINAL INDICATOR -00C0..00D6 ; Latin # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS -00D8..00F6 ; Latin # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS -00F8..01BA ; Latin # L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL -01BB ; Latin # Lo LATIN LETTER TWO WITH STROKE -01BC..01BF ; Latin # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN -01C0..01C3 ; Latin # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK -01C4..0293 ; Latin # L& [208] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER EZH WITH CURL -0294 ; Latin # Lo LATIN LETTER GLOTTAL STOP -0295..02AF ; Latin # L& [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL -02B0..02B8 ; Latin # Lm [9] MODIFIER LETTER SMALL H..MODIFIER LETTER SMALL Y -02E0..02E4 ; Latin # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP -1D00..1D25 ; Latin # L& [38] LATIN LETTER SMALL CAPITAL A..LATIN LETTER AIN -1D2C..1D5C ; Latin # Lm [49] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL AIN -1D62..1D65 ; Latin # Lm [4] LATIN SUBSCRIPT SMALL LETTER I..LATIN SUBSCRIPT SMALL LETTER V -1D6B..1D77 ; Latin # L& [13] LATIN SMALL LETTER UE..LATIN SMALL LETTER TURNED G -1D79..1D9A ; Latin # L& [34] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK -1D9B..1DBE ; Latin # Lm [36] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL EZH -1E00..1EFF ; Latin # L& [256] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER Y WITH LOOP -2071 ; Latin # Lm SUPERSCRIPT LATIN SMALL LETTER I -207F ; Latin # Lm SUPERSCRIPT LATIN SMALL LETTER N -2090..209C ; Latin # Lm [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T -212A..212B ; Latin # L& [2] KELVIN SIGN..ANGSTROM SIGN -2132 ; Latin # L& TURNED CAPITAL F -214E ; Latin # L& TURNED SMALL F -2160..2182 ; Latin # Nl [35] ROMAN NUMERAL ONE..ROMAN NUMERAL TEN THOUSAND -2183..2184 ; Latin # L& [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C -2185..2188 ; Latin # Nl [4] ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND -2C60..2C7B ; Latin # L& [28] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN LETTER SMALL CAPITAL TURNED E -2C7C..2C7D ; Latin # Lm [2] LATIN SUBSCRIPT SMALL LETTER J..MODIFIER LETTER CAPITAL V -2C7E..2C7F ; Latin # L& [2] LATIN CAPITAL LETTER S WITH SWASH TAIL..LATIN CAPITAL LETTER Z WITH SWASH TAIL -A722..A76F ; Latin # L& [78] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN SMALL LETTER CON -A770 ; Latin # Lm MODIFIER LETTER US -A771..A787 ; Latin # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T -A78B..A78E ; Latin # L& [4] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT -A78F ; Latin # Lo LATIN LETTER SINOLOGICAL DOT -A790..A7AE ; Latin # L& [31] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN CAPITAL LETTER SMALL CAPITAL I -A7B0..A7B7 ; Latin # L& [8] LATIN CAPITAL LETTER TURNED K..LATIN SMALL LETTER OMEGA -A7F7 ; Latin # Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I -A7F8..A7F9 ; Latin # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE -A7FA ; Latin # L& LATIN LETTER SMALL CAPITAL TURNED M -A7FB..A7FF ; Latin # Lo [5] LATIN EPIGRAPHIC LETTER REVERSED F..LATIN EPIGRAPHIC LETTER ARCHAIC M -AB30..AB5A ; Latin # L& [43] LATIN SMALL LETTER BARRED ALPHA..LATIN SMALL LETTER Y WITH SHORT RIGHT LEG -AB5C..AB5F ; Latin # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK -AB60..AB64 ; Latin # L& [5] LATIN SMALL LETTER SAKHA YAT..LATIN SMALL LETTER INVERTED ALPHA -FB00..FB06 ; Latin # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST -FF21..FF3A ; Latin # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z -FF41..FF5A ; Latin # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z - -# Total code points: 1350 - -# ================================================ - -0370..0373 ; Greek # L& [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI -0375 ; Greek # Sk GREEK LOWER NUMERAL SIGN -0376..0377 ; Greek # L& [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA -037A ; Greek # Lm GREEK YPOGEGRAMMENI -037B..037D ; Greek # L& [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL -037F ; Greek # L& GREEK CAPITAL LETTER YOT -0384 ; Greek # Sk GREEK TONOS -0386 ; Greek # L& GREEK CAPITAL LETTER ALPHA WITH TONOS -0388..038A ; Greek # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS -038C ; Greek # L& GREEK CAPITAL LETTER OMICRON WITH TONOS -038E..03A1 ; Greek # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO -03A3..03E1 ; Greek # L& [63] GREEK CAPITAL LETTER SIGMA..GREEK SMALL LETTER SAMPI -03F0..03F5 ; Greek # L& [6] GREEK KAPPA SYMBOL..GREEK LUNATE EPSILON SYMBOL -03F6 ; Greek # Sm GREEK REVERSED LUNATE EPSILON SYMBOL -03F7..03FF ; Greek # L& [9] GREEK CAPITAL LETTER SHO..GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL -1D26..1D2A ; Greek # L& [5] GREEK LETTER SMALL CAPITAL GAMMA..GREEK LETTER SMALL CAPITAL PSI -1D5D..1D61 ; Greek # Lm [5] MODIFIER LETTER SMALL BETA..MODIFIER LETTER SMALL CHI -1D66..1D6A ; Greek # Lm [5] GREEK SUBSCRIPT SMALL LETTER BETA..GREEK SUBSCRIPT SMALL LETTER CHI -1DBF ; Greek # Lm MODIFIER LETTER SMALL THETA -1F00..1F15 ; Greek # L& [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA -1F18..1F1D ; Greek # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA -1F20..1F45 ; Greek # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA -1F48..1F4D ; Greek # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA -1F50..1F57 ; Greek # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI -1F59 ; Greek # L& GREEK CAPITAL LETTER UPSILON WITH DASIA -1F5B ; Greek # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA -1F5D ; Greek # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA -1F5F..1F7D ; Greek # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA -1F80..1FB4 ; Greek # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI -1FB6..1FBC ; Greek # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI -1FBD ; Greek # Sk GREEK KORONIS -1FBE ; Greek # L& GREEK PROSGEGRAMMENI -1FBF..1FC1 ; Greek # Sk [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI -1FC2..1FC4 ; Greek # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI -1FC6..1FCC ; Greek # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI -1FCD..1FCF ; Greek # Sk [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI -1FD0..1FD3 ; Greek # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA -1FD6..1FDB ; Greek # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA -1FDD..1FDF ; Greek # Sk [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI -1FE0..1FEC ; Greek # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA -1FED..1FEF ; Greek # Sk [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA -1FF2..1FF4 ; Greek # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI -1FF6..1FFC ; Greek # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI -1FFD..1FFE ; Greek # Sk [2] GREEK OXIA..GREEK DASIA -2126 ; Greek # L& OHM SIGN -AB65 ; Greek # L& GREEK LETTER SMALL CAPITAL OMEGA -10140..10174 ; Greek # Nl [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS -10175..10178 ; Greek # No [4] GREEK ONE HALF SIGN..GREEK THREE QUARTERS SIGN -10179..10189 ; Greek # So [17] GREEK YEAR SIGN..GREEK TRYBLION BASE SIGN -1018A..1018B ; Greek # No [2] GREEK ZERO SIGN..GREEK ONE QUARTER SIGN -1018C..1018E ; Greek # So [3] GREEK SINUSOID SIGN..NOMISMA SIGN -101A0 ; Greek # So GREEK SYMBOL TAU RHO -1D200..1D241 ; Greek # So [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54 -1D242..1D244 ; Greek # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME -1D245 ; Greek # So GREEK MUSICAL LEIMMA - -# Total code points: 518 - -# ================================================ - -0400..0481 ; Cyrillic # L& [130] CYRILLIC CAPITAL LETTER IE WITH GRAVE..CYRILLIC SMALL LETTER KOPPA -0482 ; Cyrillic # So CYRILLIC THOUSANDS SIGN -0483..0484 ; Cyrillic # Mn [2] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC PALATALIZATION -0487 ; Cyrillic # Mn COMBINING CYRILLIC POKRYTIE -0488..0489 ; Cyrillic # Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN -048A..052F ; Cyrillic # L& [166] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EL WITH DESCENDER -1C80..1C88 ; Cyrillic # L& [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK -1D2B ; Cyrillic # L& CYRILLIC LETTER SMALL CAPITAL EL -1D78 ; Cyrillic # Lm MODIFIER LETTER CYRILLIC EN -2DE0..2DFF ; Cyrillic # Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS -A640..A66D ; Cyrillic # L& [46] CYRILLIC CAPITAL LETTER ZEMLYA..CYRILLIC SMALL LETTER DOUBLE MONOCULAR O -A66E ; Cyrillic # Lo CYRILLIC LETTER MULTIOCULAR O -A66F ; Cyrillic # Mn COMBINING CYRILLIC VZMET -A670..A672 ; Cyrillic # Me [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN -A673 ; Cyrillic # Po SLAVONIC ASTERISK -A674..A67D ; Cyrillic # Mn [10] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC PAYEROK -A67E ; Cyrillic # Po CYRILLIC KAVYKA -A67F ; Cyrillic # Lm CYRILLIC PAYEROK -A680..A69B ; Cyrillic # L& [28] CYRILLIC CAPITAL LETTER DWE..CYRILLIC SMALL LETTER CROSSED O -A69C..A69D ; Cyrillic # Lm [2] MODIFIER LETTER CYRILLIC HARD SIGN..MODIFIER LETTER CYRILLIC SOFT SIGN -A69E..A69F ; Cyrillic # Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E -FE2E..FE2F ; Cyrillic # Mn [2] COMBINING CYRILLIC TITLO LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF - -# Total code points: 443 - -# ================================================ - -0531..0556 ; Armenian # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH -0559 ; Armenian # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING -055A..055F ; Armenian # Po [6] ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK -0561..0587 ; Armenian # L& [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN -058A ; Armenian # Pd ARMENIAN HYPHEN -058D..058E ; Armenian # So [2] RIGHT-FACING ARMENIAN ETERNITY SIGN..LEFT-FACING ARMENIAN ETERNITY SIGN -058F ; Armenian # Sc ARMENIAN DRAM SIGN -FB13..FB17 ; Armenian # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH - -# Total code points: 93 - -# ================================================ - -0591..05BD ; Hebrew # Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG -05BE ; Hebrew # Pd HEBREW PUNCTUATION MAQAF -05BF ; Hebrew # Mn HEBREW POINT RAFE -05C0 ; Hebrew # Po HEBREW PUNCTUATION PASEQ -05C1..05C2 ; Hebrew # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT -05C3 ; Hebrew # Po HEBREW PUNCTUATION SOF PASUQ -05C4..05C5 ; Hebrew # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT -05C6 ; Hebrew # Po HEBREW PUNCTUATION NUN HAFUKHA -05C7 ; Hebrew # Mn HEBREW POINT QAMATS QATAN -05D0..05EA ; Hebrew # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV -05F0..05F2 ; Hebrew # Lo [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD -05F3..05F4 ; Hebrew # Po [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM -FB1D ; Hebrew # Lo HEBREW LETTER YOD WITH HIRIQ -FB1E ; Hebrew # Mn HEBREW POINT JUDEO-SPANISH VARIKA -FB1F..FB28 ; Hebrew # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV -FB29 ; Hebrew # Sm HEBREW LETTER ALTERNATIVE PLUS SIGN -FB2A..FB36 ; Hebrew # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH -FB38..FB3C ; Hebrew # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH -FB3E ; Hebrew # Lo HEBREW LETTER MEM WITH DAGESH -FB40..FB41 ; Hebrew # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH -FB43..FB44 ; Hebrew # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH -FB46..FB4F ; Hebrew # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATURE ALEF LAMED - -# Total code points: 133 - -# ================================================ - -0600..0604 ; Arabic # Cf [5] ARABIC NUMBER SIGN..ARABIC SIGN SAMVAT -0606..0608 ; Arabic # Sm [3] ARABIC-INDIC CUBE ROOT..ARABIC RAY -0609..060A ; Arabic # Po [2] ARABIC-INDIC PER MILLE SIGN..ARABIC-INDIC PER TEN THOUSAND SIGN -060B ; Arabic # Sc AFGHANI SIGN -060D ; Arabic # Po ARABIC DATE SEPARATOR -060E..060F ; Arabic # So [2] ARABIC POETIC VERSE SIGN..ARABIC SIGN MISRA -0610..061A ; Arabic # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA -061C ; Arabic # Cf ARABIC LETTER MARK -061E ; Arabic # Po ARABIC TRIPLE DOT PUNCTUATION MARK -0620..063F ; Arabic # Lo [32] ARABIC LETTER KASHMIRI YEH..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE -0641..064A ; Arabic # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH -0656..065F ; Arabic # Mn [10] ARABIC SUBSCRIPT ALEF..ARABIC WAVY HAMZA BELOW -0660..0669 ; Arabic # Nd [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE -066A..066D ; Arabic # Po [4] ARABIC PERCENT SIGN..ARABIC FIVE POINTED STAR -066E..066F ; Arabic # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF -0671..06D3 ; Arabic # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE -06D4 ; Arabic # Po ARABIC FULL STOP -06D5 ; Arabic # Lo ARABIC LETTER AE -06D6..06DC ; Arabic # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN -06DE ; Arabic # So ARABIC START OF RUB EL HIZB -06DF..06E4 ; Arabic # Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA -06E5..06E6 ; Arabic # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH -06E7..06E8 ; Arabic # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON -06E9 ; Arabic # So ARABIC PLACE OF SAJDAH -06EA..06ED ; Arabic # Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM -06EE..06EF ; Arabic # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V -06F0..06F9 ; Arabic # Nd [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE -06FA..06FC ; Arabic # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW -06FD..06FE ; Arabic # So [2] ARABIC SIGN SINDHI AMPERSAND..ARABIC SIGN SINDHI POSTPOSITION MEN -06FF ; Arabic # Lo ARABIC LETTER HEH WITH INVERTED V -0750..077F ; Arabic # Lo [48] ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW..ARABIC LETTER KAF WITH TWO DOTS ABOVE -08A0..08B4 ; Arabic # Lo [21] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER KAF WITH DOT BELOW -08B6..08BD ; Arabic # Lo [8] ARABIC LETTER BEH WITH SMALL MEEM ABOVE..ARABIC LETTER AFRICAN NOON -08D4..08E1 ; Arabic # Mn [14] ARABIC SMALL HIGH WORD AR-RUB..ARABIC SMALL HIGH SIGN SAFHA -08E3..08FF ; Arabic # Mn [29] ARABIC TURNED DAMMA BELOW..ARABIC MARK SIDEWAYS NOON GHUNNA -FB50..FBB1 ; Arabic # Lo [98] ARABIC LETTER ALEF WASLA ISOLATED FORM..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM -FBB2..FBC1 ; Arabic # Sk [16] ARABIC SYMBOL DOT ABOVE..ARABIC SYMBOL SMALL TAH BELOW -FBD3..FD3D ; Arabic # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM -FD50..FD8F ; Arabic # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM -FD92..FDC7 ; Arabic # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM -FDF0..FDFB ; Arabic # Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU -FDFC ; Arabic # Sc RIAL SIGN -FDFD ; Arabic # So ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM -FE70..FE74 ; Arabic # Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM -FE76..FEFC ; Arabic # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM -10E60..10E7E ; Arabic # No [31] RUMI DIGIT ONE..RUMI FRACTION TWO THIRDS -1EE00..1EE03 ; Arabic # Lo [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL -1EE05..1EE1F ; Arabic # Lo [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF -1EE21..1EE22 ; Arabic # Lo [2] ARABIC MATHEMATICAL INITIAL BEH..ARABIC MATHEMATICAL INITIAL JEEM -1EE24 ; Arabic # Lo ARABIC MATHEMATICAL INITIAL HEH -1EE27 ; Arabic # Lo ARABIC MATHEMATICAL INITIAL HAH -1EE29..1EE32 ; Arabic # Lo [10] ARABIC MATHEMATICAL INITIAL YEH..ARABIC MATHEMATICAL INITIAL QAF -1EE34..1EE37 ; Arabic # Lo [4] ARABIC MATHEMATICAL INITIAL SHEEN..ARABIC MATHEMATICAL INITIAL KHAH -1EE39 ; Arabic # Lo ARABIC MATHEMATICAL INITIAL DAD -1EE3B ; Arabic # Lo ARABIC MATHEMATICAL INITIAL GHAIN -1EE42 ; Arabic # Lo ARABIC MATHEMATICAL TAILED JEEM -1EE47 ; Arabic # Lo ARABIC MATHEMATICAL TAILED HAH -1EE49 ; Arabic # Lo ARABIC MATHEMATICAL TAILED YEH -1EE4B ; Arabic # Lo ARABIC MATHEMATICAL TAILED LAM -1EE4D..1EE4F ; Arabic # Lo [3] ARABIC MATHEMATICAL TAILED NOON..ARABIC MATHEMATICAL TAILED AIN -1EE51..1EE52 ; Arabic # Lo [2] ARABIC MATHEMATICAL TAILED SAD..ARABIC MATHEMATICAL TAILED QAF -1EE54 ; Arabic # Lo ARABIC MATHEMATICAL TAILED SHEEN -1EE57 ; Arabic # Lo ARABIC MATHEMATICAL TAILED KHAH -1EE59 ; Arabic # Lo ARABIC MATHEMATICAL TAILED DAD -1EE5B ; Arabic # Lo ARABIC MATHEMATICAL TAILED GHAIN -1EE5D ; Arabic # Lo ARABIC MATHEMATICAL TAILED DOTLESS NOON -1EE5F ; Arabic # Lo ARABIC MATHEMATICAL TAILED DOTLESS QAF -1EE61..1EE62 ; Arabic # Lo [2] ARABIC MATHEMATICAL STRETCHED BEH..ARABIC MATHEMATICAL STRETCHED JEEM -1EE64 ; Arabic # Lo ARABIC MATHEMATICAL STRETCHED HEH -1EE67..1EE6A ; Arabic # Lo [4] ARABIC MATHEMATICAL STRETCHED HAH..ARABIC MATHEMATICAL STRETCHED KAF -1EE6C..1EE72 ; Arabic # Lo [7] ARABIC MATHEMATICAL STRETCHED MEEM..ARABIC MATHEMATICAL STRETCHED QAF -1EE74..1EE77 ; Arabic # Lo [4] ARABIC MATHEMATICAL STRETCHED SHEEN..ARABIC MATHEMATICAL STRETCHED KHAH -1EE79..1EE7C ; Arabic # Lo [4] ARABIC MATHEMATICAL STRETCHED DAD..ARABIC MATHEMATICAL STRETCHED DOTLESS BEH -1EE7E ; Arabic # Lo ARABIC MATHEMATICAL STRETCHED DOTLESS FEH -1EE80..1EE89 ; Arabic # Lo [10] ARABIC MATHEMATICAL LOOPED ALEF..ARABIC MATHEMATICAL LOOPED YEH -1EE8B..1EE9B ; Arabic # Lo [17] ARABIC MATHEMATICAL LOOPED LAM..ARABIC MATHEMATICAL LOOPED GHAIN -1EEA1..1EEA3 ; Arabic # Lo [3] ARABIC MATHEMATICAL DOUBLE-STRUCK BEH..ARABIC MATHEMATICAL DOUBLE-STRUCK DAL -1EEA5..1EEA9 ; Arabic # Lo [5] ARABIC MATHEMATICAL DOUBLE-STRUCK WAW..ARABIC MATHEMATICAL DOUBLE-STRUCK YEH -1EEAB..1EEBB ; Arabic # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN -1EEF0..1EEF1 ; Arabic # Sm [2] ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL..ARABIC MATHEMATICAL OPERATOR HAH WITH DAL - -# Total code points: 1280 - -# ================================================ - -0700..070D ; Syriac # Po [14] SYRIAC END OF PARAGRAPH..SYRIAC HARKLEAN ASTERISCUS -070F ; Syriac # Cf SYRIAC ABBREVIATION MARK -0710 ; Syriac # Lo SYRIAC LETTER ALAPH -0711 ; Syriac # Mn SYRIAC LETTER SUPERSCRIPT ALAPH -0712..072F ; Syriac # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH -0730..074A ; Syriac # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH -074D..074F ; Syriac # Lo [3] SYRIAC LETTER SOGDIAN ZHAIN..SYRIAC LETTER SOGDIAN FE -0860..086A ; Syriac # Lo [11] SYRIAC LETTER MALAYALAM NGA..SYRIAC LETTER MALAYALAM SSA - -# Total code points: 88 - -# ================================================ - -0780..07A5 ; Thaana # Lo [38] THAANA LETTER HAA..THAANA LETTER WAAVU -07A6..07B0 ; Thaana # Mn [11] THAANA ABAFILI..THAANA SUKUN -07B1 ; Thaana # Lo THAANA LETTER NAA - -# Total code points: 50 - -# ================================================ - -0900..0902 ; Devanagari # Mn [3] DEVANAGARI SIGN INVERTED CANDRABINDU..DEVANAGARI SIGN ANUSVARA -0903 ; Devanagari # Mc DEVANAGARI SIGN VISARGA -0904..0939 ; Devanagari # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA -093A ; Devanagari # Mn DEVANAGARI VOWEL SIGN OE -093B ; Devanagari # Mc DEVANAGARI VOWEL SIGN OOE -093C ; Devanagari # Mn DEVANAGARI SIGN NUKTA -093D ; Devanagari # Lo DEVANAGARI SIGN AVAGRAHA -093E..0940 ; Devanagari # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II -0941..0948 ; Devanagari # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI -0949..094C ; Devanagari # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU -094D ; Devanagari # Mn DEVANAGARI SIGN VIRAMA -094E..094F ; Devanagari # Mc [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW -0950 ; Devanagari # Lo DEVANAGARI OM -0953..0957 ; Devanagari # Mn [5] DEVANAGARI GRAVE ACCENT..DEVANAGARI VOWEL SIGN UUE -0958..0961 ; Devanagari # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL -0962..0963 ; Devanagari # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL -0966..096F ; Devanagari # Nd [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE -0970 ; Devanagari # Po DEVANAGARI ABBREVIATION SIGN -0971 ; Devanagari # Lm DEVANAGARI SIGN HIGH SPACING DOT -0972..097F ; Devanagari # Lo [14] DEVANAGARI LETTER CANDRA A..DEVANAGARI LETTER BBA -A8E0..A8F1 ; Devanagari # Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA -A8F2..A8F7 ; Devanagari # Lo [6] DEVANAGARI SIGN SPACING CANDRABINDU..DEVANAGARI SIGN CANDRABINDU AVAGRAHA -A8F8..A8FA ; Devanagari # Po [3] DEVANAGARI SIGN PUSHPIKA..DEVANAGARI CARET -A8FB ; Devanagari # Lo DEVANAGARI HEADSTROKE -A8FC ; Devanagari # Po DEVANAGARI SIGN SIDDHAM -A8FD ; Devanagari # Lo DEVANAGARI JAIN OM - -# Total code points: 154 - -# ================================================ - -0980 ; Bengali # Lo BENGALI ANJI -0981 ; Bengali # Mn BENGALI SIGN CANDRABINDU -0982..0983 ; Bengali # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA -0985..098C ; Bengali # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L -098F..0990 ; Bengali # Lo [2] BENGALI LETTER E..BENGALI LETTER AI -0993..09A8 ; Bengali # Lo [22] BENGALI LETTER O..BENGALI LETTER NA -09AA..09B0 ; Bengali # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA -09B2 ; Bengali # Lo BENGALI LETTER LA -09B6..09B9 ; Bengali # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA -09BC ; Bengali # Mn BENGALI SIGN NUKTA -09BD ; Bengali # Lo BENGALI SIGN AVAGRAHA -09BE..09C0 ; Bengali # Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II -09C1..09C4 ; Bengali # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR -09C7..09C8 ; Bengali # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI -09CB..09CC ; Bengali # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU -09CD ; Bengali # Mn BENGALI SIGN VIRAMA -09CE ; Bengali # Lo BENGALI LETTER KHANDA TA -09D7 ; Bengali # Mc BENGALI AU LENGTH MARK -09DC..09DD ; Bengali # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA -09DF..09E1 ; Bengali # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL -09E2..09E3 ; Bengali # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL -09E6..09EF ; Bengali # Nd [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE -09F0..09F1 ; Bengali # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL -09F2..09F3 ; Bengali # Sc [2] BENGALI RUPEE MARK..BENGALI RUPEE SIGN -09F4..09F9 ; Bengali # No [6] BENGALI CURRENCY NUMERATOR ONE..BENGALI CURRENCY DENOMINATOR SIXTEEN -09FA ; Bengali # So BENGALI ISSHAR -09FB ; Bengali # Sc BENGALI GANDA MARK -09FC ; Bengali # Lo BENGALI LETTER VEDIC ANUSVARA -09FD ; Bengali # Po BENGALI ABBREVIATION SIGN - -# Total code points: 95 - -# ================================================ - -0A01..0A02 ; Gurmukhi # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI -0A03 ; Gurmukhi # Mc GURMUKHI SIGN VISARGA -0A05..0A0A ; Gurmukhi # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU -0A0F..0A10 ; Gurmukhi # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI -0A13..0A28 ; Gurmukhi # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA -0A2A..0A30 ; Gurmukhi # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA -0A32..0A33 ; Gurmukhi # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA -0A35..0A36 ; Gurmukhi # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA -0A38..0A39 ; Gurmukhi # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA -0A3C ; Gurmukhi # Mn GURMUKHI SIGN NUKTA -0A3E..0A40 ; Gurmukhi # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II -0A41..0A42 ; Gurmukhi # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU -0A47..0A48 ; Gurmukhi # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI -0A4B..0A4D ; Gurmukhi # Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA -0A51 ; Gurmukhi # Mn GURMUKHI SIGN UDAAT -0A59..0A5C ; Gurmukhi # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA -0A5E ; Gurmukhi # Lo GURMUKHI LETTER FA -0A66..0A6F ; Gurmukhi # Nd [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE -0A70..0A71 ; Gurmukhi # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK -0A72..0A74 ; Gurmukhi # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR -0A75 ; Gurmukhi # Mn GURMUKHI SIGN YAKASH - -# Total code points: 79 - -# ================================================ - -0A81..0A82 ; Gujarati # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA -0A83 ; Gujarati # Mc GUJARATI SIGN VISARGA -0A85..0A8D ; Gujarati # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E -0A8F..0A91 ; Gujarati # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O -0A93..0AA8 ; Gujarati # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA -0AAA..0AB0 ; Gujarati # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA -0AB2..0AB3 ; Gujarati # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA -0AB5..0AB9 ; Gujarati # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA -0ABC ; Gujarati # Mn GUJARATI SIGN NUKTA -0ABD ; Gujarati # Lo GUJARATI SIGN AVAGRAHA -0ABE..0AC0 ; Gujarati # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II -0AC1..0AC5 ; Gujarati # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E -0AC7..0AC8 ; Gujarati # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI -0AC9 ; Gujarati # Mc GUJARATI VOWEL SIGN CANDRA O -0ACB..0ACC ; Gujarati # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU -0ACD ; Gujarati # Mn GUJARATI SIGN VIRAMA -0AD0 ; Gujarati # Lo GUJARATI OM -0AE0..0AE1 ; Gujarati # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL -0AE2..0AE3 ; Gujarati # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL -0AE6..0AEF ; Gujarati # Nd [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE -0AF0 ; Gujarati # Po GUJARATI ABBREVIATION SIGN -0AF1 ; Gujarati # Sc GUJARATI RUPEE SIGN -0AF9 ; Gujarati # Lo GUJARATI LETTER ZHA -0AFA..0AFF ; Gujarati # Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE - -# Total code points: 91 - -# ================================================ - -0B01 ; Oriya # Mn ORIYA SIGN CANDRABINDU -0B02..0B03 ; Oriya # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA -0B05..0B0C ; Oriya # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L -0B0F..0B10 ; Oriya # Lo [2] ORIYA LETTER E..ORIYA LETTER AI -0B13..0B28 ; Oriya # Lo [22] ORIYA LETTER O..ORIYA LETTER NA -0B2A..0B30 ; Oriya # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA -0B32..0B33 ; Oriya # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA -0B35..0B39 ; Oriya # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA -0B3C ; Oriya # Mn ORIYA SIGN NUKTA -0B3D ; Oriya # Lo ORIYA SIGN AVAGRAHA -0B3E ; Oriya # Mc ORIYA VOWEL SIGN AA -0B3F ; Oriya # Mn ORIYA VOWEL SIGN I -0B40 ; Oriya # Mc ORIYA VOWEL SIGN II -0B41..0B44 ; Oriya # Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR -0B47..0B48 ; Oriya # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI -0B4B..0B4C ; Oriya # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU -0B4D ; Oriya # Mn ORIYA SIGN VIRAMA -0B56 ; Oriya # Mn ORIYA AI LENGTH MARK -0B57 ; Oriya # Mc ORIYA AU LENGTH MARK -0B5C..0B5D ; Oriya # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA -0B5F..0B61 ; Oriya # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL -0B62..0B63 ; Oriya # Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL -0B66..0B6F ; Oriya # Nd [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE -0B70 ; Oriya # So ORIYA ISSHAR -0B71 ; Oriya # Lo ORIYA LETTER WA -0B72..0B77 ; Oriya # No [6] ORIYA FRACTION ONE QUARTER..ORIYA FRACTION THREE SIXTEENTHS - -# Total code points: 90 - -# ================================================ - -0B82 ; Tamil # Mn TAMIL SIGN ANUSVARA -0B83 ; Tamil # Lo TAMIL SIGN VISARGA -0B85..0B8A ; Tamil # Lo [6] TAMIL LETTER A..TAMIL LETTER UU -0B8E..0B90 ; Tamil # Lo [3] TAMIL LETTER E..TAMIL LETTER AI -0B92..0B95 ; Tamil # Lo [4] TAMIL LETTER O..TAMIL LETTER KA -0B99..0B9A ; Tamil # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA -0B9C ; Tamil # Lo TAMIL LETTER JA -0B9E..0B9F ; Tamil # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA -0BA3..0BA4 ; Tamil # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA -0BA8..0BAA ; Tamil # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA -0BAE..0BB9 ; Tamil # Lo [12] TAMIL LETTER MA..TAMIL LETTER HA -0BBE..0BBF ; Tamil # Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I -0BC0 ; Tamil # Mn TAMIL VOWEL SIGN II -0BC1..0BC2 ; Tamil # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU -0BC6..0BC8 ; Tamil # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI -0BCA..0BCC ; Tamil # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU -0BCD ; Tamil # Mn TAMIL SIGN VIRAMA -0BD0 ; Tamil # Lo TAMIL OM -0BD7 ; Tamil # Mc TAMIL AU LENGTH MARK -0BE6..0BEF ; Tamil # Nd [10] TAMIL DIGIT ZERO..TAMIL DIGIT NINE -0BF0..0BF2 ; Tamil # No [3] TAMIL NUMBER TEN..TAMIL NUMBER ONE THOUSAND -0BF3..0BF8 ; Tamil # So [6] TAMIL DAY SIGN..TAMIL AS ABOVE SIGN -0BF9 ; Tamil # Sc TAMIL RUPEE SIGN -0BFA ; Tamil # So TAMIL NUMBER SIGN - -# Total code points: 72 - -# ================================================ - -0C00 ; Telugu # Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE -0C01..0C03 ; Telugu # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA -0C05..0C0C ; Telugu # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L -0C0E..0C10 ; Telugu # Lo [3] TELUGU LETTER E..TELUGU LETTER AI -0C12..0C28 ; Telugu # Lo [23] TELUGU LETTER O..TELUGU LETTER NA -0C2A..0C39 ; Telugu # Lo [16] TELUGU LETTER PA..TELUGU LETTER HA -0C3D ; Telugu # Lo TELUGU SIGN AVAGRAHA -0C3E..0C40 ; Telugu # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II -0C41..0C44 ; Telugu # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR -0C46..0C48 ; Telugu # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI -0C4A..0C4D ; Telugu # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA -0C55..0C56 ; Telugu # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK -0C58..0C5A ; Telugu # Lo [3] TELUGU LETTER TSA..TELUGU LETTER RRRA -0C60..0C61 ; Telugu # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL -0C62..0C63 ; Telugu # Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL -0C66..0C6F ; Telugu # Nd [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE -0C78..0C7E ; Telugu # No [7] TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR..TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR -0C7F ; Telugu # So TELUGU SIGN TUUMU - -# Total code points: 96 - -# ================================================ - -0C80 ; Kannada # Lo KANNADA SIGN SPACING CANDRABINDU -0C81 ; Kannada # Mn KANNADA SIGN CANDRABINDU -0C82..0C83 ; Kannada # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA -0C85..0C8C ; Kannada # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L -0C8E..0C90 ; Kannada # Lo [3] KANNADA LETTER E..KANNADA LETTER AI -0C92..0CA8 ; Kannada # Lo [23] KANNADA LETTER O..KANNADA LETTER NA -0CAA..0CB3 ; Kannada # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA -0CB5..0CB9 ; Kannada # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA -0CBC ; Kannada # Mn KANNADA SIGN NUKTA -0CBD ; Kannada # Lo KANNADA SIGN AVAGRAHA -0CBE ; Kannada # Mc KANNADA VOWEL SIGN AA -0CBF ; Kannada # Mn KANNADA VOWEL SIGN I -0CC0..0CC4 ; Kannada # Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR -0CC6 ; Kannada # Mn KANNADA VOWEL SIGN E -0CC7..0CC8 ; Kannada # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI -0CCA..0CCB ; Kannada # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO -0CCC..0CCD ; Kannada # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA -0CD5..0CD6 ; Kannada # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK -0CDE ; Kannada # Lo KANNADA LETTER FA -0CE0..0CE1 ; Kannada # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL -0CE2..0CE3 ; Kannada # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL -0CE6..0CEF ; Kannada # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE -0CF1..0CF2 ; Kannada # Lo [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA - -# Total code points: 88 - -# ================================================ - -0D00..0D01 ; Malayalam # Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU -0D02..0D03 ; Malayalam # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA -0D05..0D0C ; Malayalam # Lo [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L -0D0E..0D10 ; Malayalam # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI -0D12..0D3A ; Malayalam # Lo [41] MALAYALAM LETTER O..MALAYALAM LETTER TTTA -0D3B..0D3C ; Malayalam # Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA -0D3D ; Malayalam # Lo MALAYALAM SIGN AVAGRAHA -0D3E..0D40 ; Malayalam # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II -0D41..0D44 ; Malayalam # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR -0D46..0D48 ; Malayalam # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI -0D4A..0D4C ; Malayalam # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU -0D4D ; Malayalam # Mn MALAYALAM SIGN VIRAMA -0D4E ; Malayalam # Lo MALAYALAM LETTER DOT REPH -0D4F ; Malayalam # So MALAYALAM SIGN PARA -0D54..0D56 ; Malayalam # Lo [3] MALAYALAM LETTER CHILLU M..MALAYALAM LETTER CHILLU LLL -0D57 ; Malayalam # Mc MALAYALAM AU LENGTH MARK -0D58..0D5E ; Malayalam # No [7] MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH..MALAYALAM FRACTION ONE FIFTH -0D5F..0D61 ; Malayalam # Lo [3] MALAYALAM LETTER ARCHAIC II..MALAYALAM LETTER VOCALIC LL -0D62..0D63 ; Malayalam # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL -0D66..0D6F ; Malayalam # Nd [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE -0D70..0D78 ; Malayalam # No [9] MALAYALAM NUMBER TEN..MALAYALAM FRACTION THREE SIXTEENTHS -0D79 ; Malayalam # So MALAYALAM DATE MARK -0D7A..0D7F ; Malayalam # Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K - -# Total code points: 117 - -# ================================================ - -0D82..0D83 ; Sinhala # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA -0D85..0D96 ; Sinhala # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA -0D9A..0DB1 ; Sinhala # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA -0DB3..0DBB ; Sinhala # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA -0DBD ; Sinhala # Lo SINHALA LETTER DANTAJA LAYANNA -0DC0..0DC6 ; Sinhala # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA -0DCA ; Sinhala # Mn SINHALA SIGN AL-LAKUNA -0DCF..0DD1 ; Sinhala # Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA -0DD2..0DD4 ; Sinhala # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA -0DD6 ; Sinhala # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA -0DD8..0DDF ; Sinhala # Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA -0DE6..0DEF ; Sinhala # Nd [10] SINHALA LITH DIGIT ZERO..SINHALA LITH DIGIT NINE -0DF2..0DF3 ; Sinhala # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA -0DF4 ; Sinhala # Po SINHALA PUNCTUATION KUNDDALIYA -111E1..111F4 ; Sinhala # No [20] SINHALA ARCHAIC DIGIT ONE..SINHALA ARCHAIC NUMBER ONE THOUSAND - -# Total code points: 110 - -# ================================================ - -0E01..0E30 ; Thai # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A -0E31 ; Thai # Mn THAI CHARACTER MAI HAN-AKAT -0E32..0E33 ; Thai # Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM -0E34..0E3A ; Thai # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU -0E40..0E45 ; Thai # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO -0E46 ; Thai # Lm THAI CHARACTER MAIYAMOK -0E47..0E4E ; Thai # Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN -0E4F ; Thai # Po THAI CHARACTER FONGMAN -0E50..0E59 ; Thai # Nd [10] THAI DIGIT ZERO..THAI DIGIT NINE -0E5A..0E5B ; Thai # Po [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT - -# Total code points: 86 - -# ================================================ - -0E81..0E82 ; Lao # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG -0E84 ; Lao # Lo LAO LETTER KHO TAM -0E87..0E88 ; Lao # Lo [2] LAO LETTER NGO..LAO LETTER CO -0E8A ; Lao # Lo LAO LETTER SO TAM -0E8D ; Lao # Lo LAO LETTER NYO -0E94..0E97 ; Lao # Lo [4] LAO LETTER DO..LAO LETTER THO TAM -0E99..0E9F ; Lao # Lo [7] LAO LETTER NO..LAO LETTER FO SUNG -0EA1..0EA3 ; Lao # Lo [3] LAO LETTER MO..LAO LETTER LO LING -0EA5 ; Lao # Lo LAO LETTER LO LOOT -0EA7 ; Lao # Lo LAO LETTER WO -0EAA..0EAB ; Lao # Lo [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG -0EAD..0EB0 ; Lao # Lo [4] LAO LETTER O..LAO VOWEL SIGN A -0EB1 ; Lao # Mn LAO VOWEL SIGN MAI KAN -0EB2..0EB3 ; Lao # Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM -0EB4..0EB9 ; Lao # Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU -0EBB..0EBC ; Lao # Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO -0EBD ; Lao # Lo LAO SEMIVOWEL SIGN NYO -0EC0..0EC4 ; Lao # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI -0EC6 ; Lao # Lm LAO KO LA -0EC8..0ECD ; Lao # Mn [6] LAO TONE MAI EK..LAO NIGGAHITA -0ED0..0ED9 ; Lao # Nd [10] LAO DIGIT ZERO..LAO DIGIT NINE -0EDC..0EDF ; Lao # Lo [4] LAO HO NO..LAO LETTER KHMU NYO - -# Total code points: 67 - -# ================================================ - -0F00 ; Tibetan # Lo TIBETAN SYLLABLE OM -0F01..0F03 ; Tibetan # So [3] TIBETAN MARK GTER YIG MGO TRUNCATED A..TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA -0F04..0F12 ; Tibetan # Po [15] TIBETAN MARK INITIAL YIG MGO MDUN MA..TIBETAN MARK RGYA GRAM SHAD -0F13 ; Tibetan # So TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN -0F14 ; Tibetan # Po TIBETAN MARK GTER TSHEG -0F15..0F17 ; Tibetan # So [3] TIBETAN LOGOTYPE SIGN CHAD RTAGS..TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS -0F18..0F19 ; Tibetan # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS -0F1A..0F1F ; Tibetan # So [6] TIBETAN SIGN RDEL DKAR GCIG..TIBETAN SIGN RDEL DKAR RDEL NAG -0F20..0F29 ; Tibetan # Nd [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE -0F2A..0F33 ; Tibetan # No [10] TIBETAN DIGIT HALF ONE..TIBETAN DIGIT HALF ZERO -0F34 ; Tibetan # So TIBETAN MARK BSDUS RTAGS -0F35 ; Tibetan # Mn TIBETAN MARK NGAS BZUNG NYI ZLA -0F36 ; Tibetan # So TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN -0F37 ; Tibetan # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS -0F38 ; Tibetan # So TIBETAN MARK CHE MGO -0F39 ; Tibetan # Mn TIBETAN MARK TSA -PHRU -0F3A ; Tibetan # Ps TIBETAN MARK GUG RTAGS GYON -0F3B ; Tibetan # Pe TIBETAN MARK GUG RTAGS GYAS -0F3C ; Tibetan # Ps TIBETAN MARK ANG KHANG GYON -0F3D ; Tibetan # Pe TIBETAN MARK ANG KHANG GYAS -0F3E..0F3F ; Tibetan # Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES -0F40..0F47 ; Tibetan # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA -0F49..0F6C ; Tibetan # Lo [36] TIBETAN LETTER NYA..TIBETAN LETTER RRA -0F71..0F7E ; Tibetan # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO -0F7F ; Tibetan # Mc TIBETAN SIGN RNAM BCAD -0F80..0F84 ; Tibetan # Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA -0F85 ; Tibetan # Po TIBETAN MARK PALUTA -0F86..0F87 ; Tibetan # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS -0F88..0F8C ; Tibetan # Lo [5] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN INVERTED MCHU CAN -0F8D..0F97 ; Tibetan # Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA -0F99..0FBC ; Tibetan # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA -0FBE..0FC5 ; Tibetan # So [8] TIBETAN KU RU KHA..TIBETAN SYMBOL RDO RJE -0FC6 ; Tibetan # Mn TIBETAN SYMBOL PADMA GDAN -0FC7..0FCC ; Tibetan # So [6] TIBETAN SYMBOL RDO RJE RGYA GRAM..TIBETAN SYMBOL NOR BU BZHI -KHYIL -0FCE..0FCF ; Tibetan # So [2] TIBETAN SIGN RDEL NAG RDEL DKAR..TIBETAN SIGN RDEL NAG GSUM -0FD0..0FD4 ; Tibetan # Po [5] TIBETAN MARK BSKA- SHOG GI MGO RGYAN..TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA -0FD9..0FDA ; Tibetan # Po [2] TIBETAN MARK LEADING MCHAN RTAGS..TIBETAN MARK TRAILING MCHAN RTAGS - -# Total code points: 207 - -# ================================================ - -1000..102A ; Myanmar # Lo [43] MYANMAR LETTER KA..MYANMAR LETTER AU -102B..102C ; Myanmar # Mc [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA -102D..1030 ; Myanmar # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU -1031 ; Myanmar # Mc MYANMAR VOWEL SIGN E -1032..1037 ; Myanmar # Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW -1038 ; Myanmar # Mc MYANMAR SIGN VISARGA -1039..103A ; Myanmar # Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT -103B..103C ; Myanmar # Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA -103D..103E ; Myanmar # Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA -103F ; Myanmar # Lo MYANMAR LETTER GREAT SA -1040..1049 ; Myanmar # Nd [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE -104A..104F ; Myanmar # Po [6] MYANMAR SIGN LITTLE SECTION..MYANMAR SYMBOL GENITIVE -1050..1055 ; Myanmar # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL -1056..1057 ; Myanmar # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR -1058..1059 ; Myanmar # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL -105A..105D ; Myanmar # Lo [4] MYANMAR LETTER MON NGA..MYANMAR LETTER MON BBE -105E..1060 ; Myanmar # Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA -1061 ; Myanmar # Lo MYANMAR LETTER SGAW KAREN SHA -1062..1064 ; Myanmar # Mc [3] MYANMAR VOWEL SIGN SGAW KAREN EU..MYANMAR TONE MARK SGAW KAREN KE PHO -1065..1066 ; Myanmar # Lo [2] MYANMAR LETTER WESTERN PWO KAREN THA..MYANMAR LETTER WESTERN PWO KAREN PWA -1067..106D ; Myanmar # Mc [7] MYANMAR VOWEL SIGN WESTERN PWO KAREN EU..MYANMAR SIGN WESTERN PWO KAREN TONE-5 -106E..1070 ; Myanmar # Lo [3] MYANMAR LETTER EASTERN PWO KAREN NNA..MYANMAR LETTER EASTERN PWO KAREN GHWA -1071..1074 ; Myanmar # Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE -1075..1081 ; Myanmar # Lo [13] MYANMAR LETTER SHAN KA..MYANMAR LETTER SHAN HA -1082 ; Myanmar # Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA -1083..1084 ; Myanmar # Mc [2] MYANMAR VOWEL SIGN SHAN AA..MYANMAR VOWEL SIGN SHAN E -1085..1086 ; Myanmar # Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y -1087..108C ; Myanmar # Mc [6] MYANMAR SIGN SHAN TONE-2..MYANMAR SIGN SHAN COUNCIL TONE-3 -108D ; Myanmar # Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE -108E ; Myanmar # Lo MYANMAR LETTER RUMAI PALAUNG FA -108F ; Myanmar # Mc MYANMAR SIGN RUMAI PALAUNG TONE-5 -1090..1099 ; Myanmar # Nd [10] MYANMAR SHAN DIGIT ZERO..MYANMAR SHAN DIGIT NINE -109A..109C ; Myanmar # Mc [3] MYANMAR SIGN KHAMTI TONE-1..MYANMAR VOWEL SIGN AITON A -109D ; Myanmar # Mn MYANMAR VOWEL SIGN AITON AI -109E..109F ; Myanmar # So [2] MYANMAR SYMBOL SHAN ONE..MYANMAR SYMBOL SHAN EXCLAMATION -A9E0..A9E4 ; Myanmar # Lo [5] MYANMAR LETTER SHAN GHA..MYANMAR LETTER SHAN BHA -A9E5 ; Myanmar # Mn MYANMAR SIGN SHAN SAW -A9E6 ; Myanmar # Lm MYANMAR MODIFIER LETTER SHAN REDUPLICATION -A9E7..A9EF ; Myanmar # Lo [9] MYANMAR LETTER TAI LAING NYA..MYANMAR LETTER TAI LAING NNA -A9F0..A9F9 ; Myanmar # Nd [10] MYANMAR TAI LAING DIGIT ZERO..MYANMAR TAI LAING DIGIT NINE -A9FA..A9FE ; Myanmar # Lo [5] MYANMAR LETTER TAI LAING LLA..MYANMAR LETTER TAI LAING BHA -AA60..AA6F ; Myanmar # Lo [16] MYANMAR LETTER KHAMTI GA..MYANMAR LETTER KHAMTI FA -AA70 ; Myanmar # Lm MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION -AA71..AA76 ; Myanmar # Lo [6] MYANMAR LETTER KHAMTI XA..MYANMAR LOGOGRAM KHAMTI HM -AA77..AA79 ; Myanmar # So [3] MYANMAR SYMBOL AITON EXCLAMATION..MYANMAR SYMBOL AITON TWO -AA7A ; Myanmar # Lo MYANMAR LETTER AITON RA -AA7B ; Myanmar # Mc MYANMAR SIGN PAO KAREN TONE -AA7C ; Myanmar # Mn MYANMAR SIGN TAI LAING TONE-2 -AA7D ; Myanmar # Mc MYANMAR SIGN TAI LAING TONE-5 -AA7E..AA7F ; Myanmar # Lo [2] MYANMAR LETTER SHWE PALAUNG CHA..MYANMAR LETTER SHWE PALAUNG SHA - -# Total code points: 223 - -# ================================================ - -10A0..10C5 ; Georgian # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE -10C7 ; Georgian # L& GEORGIAN CAPITAL LETTER YN -10CD ; Georgian # L& GEORGIAN CAPITAL LETTER AEN -10D0..10FA ; Georgian # Lo [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN -10FC ; Georgian # Lm MODIFIER LETTER GEORGIAN NAR -10FD..10FF ; Georgian # Lo [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN -2D00..2D25 ; Georgian # L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE -2D27 ; Georgian # L& GEORGIAN SMALL LETTER YN -2D2D ; Georgian # L& GEORGIAN SMALL LETTER AEN - -# Total code points: 127 - -# ================================================ - -1100..11FF ; Hangul # Lo [256] HANGUL CHOSEONG KIYEOK..HANGUL JONGSEONG SSANGNIEUN -302E..302F ; Hangul # Mc [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK -3131..318E ; Hangul # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE -3200..321E ; Hangul # So [31] PARENTHESIZED HANGUL KIYEOK..PARENTHESIZED KOREAN CHARACTER O HU -3260..327E ; Hangul # So [31] CIRCLED HANGUL KIYEOK..CIRCLED HANGUL IEUNG U -A960..A97C ; Hangul # Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH -AC00..D7A3 ; Hangul # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH -D7B0..D7C6 ; Hangul # Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E -D7CB..D7FB ; Hangul # Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH -FFA0..FFBE ; Hangul # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH -FFC2..FFC7 ; Hangul # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E -FFCA..FFCF ; Hangul # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE -FFD2..FFD7 ; Hangul # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU -FFDA..FFDC ; Hangul # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I - -# Total code points: 11739 - -# ================================================ - -1200..1248 ; Ethiopic # Lo [73] ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE QWA -124A..124D ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE -1250..1256 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO -1258 ; Ethiopic # Lo ETHIOPIC SYLLABLE QHWA -125A..125D ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE -1260..1288 ; Ethiopic # Lo [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA -128A..128D ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE -1290..12B0 ; Ethiopic # Lo [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA -12B2..12B5 ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE -12B8..12BE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO -12C0 ; Ethiopic # Lo ETHIOPIC SYLLABLE KXWA -12C2..12C5 ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE -12C8..12D6 ; Ethiopic # Lo [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O -12D8..1310 ; Ethiopic # Lo [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA -1312..1315 ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE -1318..135A ; Ethiopic # Lo [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA -135D..135F ; Ethiopic # Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK -1360..1368 ; Ethiopic # Po [9] ETHIOPIC SECTION MARK..ETHIOPIC PARAGRAPH SEPARATOR -1369..137C ; Ethiopic # No [20] ETHIOPIC DIGIT ONE..ETHIOPIC NUMBER TEN THOUSAND -1380..138F ; Ethiopic # Lo [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE -1390..1399 ; Ethiopic # So [10] ETHIOPIC TONAL MARK YIZET..ETHIOPIC TONAL MARK KURT -2D80..2D96 ; Ethiopic # Lo [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE -2DA0..2DA6 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO -2DA8..2DAE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO -2DB0..2DB6 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO -2DB8..2DBE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO -2DC0..2DC6 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO -2DC8..2DCE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO -2DD0..2DD6 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO -2DD8..2DDE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO -AB01..AB06 ; Ethiopic # Lo [6] ETHIOPIC SYLLABLE TTHU..ETHIOPIC SYLLABLE TTHO -AB09..AB0E ; Ethiopic # Lo [6] ETHIOPIC SYLLABLE DDHU..ETHIOPIC SYLLABLE DDHO -AB11..AB16 ; Ethiopic # Lo [6] ETHIOPIC SYLLABLE DZU..ETHIOPIC SYLLABLE DZO -AB20..AB26 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE CCHHA..ETHIOPIC SYLLABLE CCHHO -AB28..AB2E ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE BBA..ETHIOPIC SYLLABLE BBO - -# Total code points: 495 - -# ================================================ - -13A0..13F5 ; Cherokee # L& [86] CHEROKEE LETTER A..CHEROKEE LETTER MV -13F8..13FD ; Cherokee # L& [6] CHEROKEE SMALL LETTER YE..CHEROKEE SMALL LETTER MV -AB70..ABBF ; Cherokee # L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA - -# Total code points: 172 - -# ================================================ - -1400 ; Canadian_Aboriginal # Pd CANADIAN SYLLABICS HYPHEN -1401..166C ; Canadian_Aboriginal # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA -166D..166E ; Canadian_Aboriginal # Po [2] CANADIAN SYLLABICS CHI SIGN..CANADIAN SYLLABICS FULL STOP -166F..167F ; Canadian_Aboriginal # Lo [17] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS BLACKFOOT W -18B0..18F5 ; Canadian_Aboriginal # Lo [70] CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S - -# Total code points: 710 - -# ================================================ - -1680 ; Ogham # Zs OGHAM SPACE MARK -1681..169A ; Ogham # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH -169B ; Ogham # Ps OGHAM FEATHER MARK -169C ; Ogham # Pe OGHAM REVERSED FEATHER MARK - -# Total code points: 29 - -# ================================================ - -16A0..16EA ; Runic # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X -16EE..16F0 ; Runic # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL -16F1..16F8 ; Runic # Lo [8] RUNIC LETTER K..RUNIC LETTER FRANKS CASKET AESC - -# Total code points: 86 - -# ================================================ - -1780..17B3 ; Khmer # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU -17B4..17B5 ; Khmer # Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA -17B6 ; Khmer # Mc KHMER VOWEL SIGN AA -17B7..17BD ; Khmer # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA -17BE..17C5 ; Khmer # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU -17C6 ; Khmer # Mn KHMER SIGN NIKAHIT -17C7..17C8 ; Khmer # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU -17C9..17D3 ; Khmer # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT -17D4..17D6 ; Khmer # Po [3] KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH -17D7 ; Khmer # Lm KHMER SIGN LEK TOO -17D8..17DA ; Khmer # Po [3] KHMER SIGN BEYYAL..KHMER SIGN KOOMUUT -17DB ; Khmer # Sc KHMER CURRENCY SYMBOL RIEL -17DC ; Khmer # Lo KHMER SIGN AVAKRAHASANYA -17DD ; Khmer # Mn KHMER SIGN ATTHACAN -17E0..17E9 ; Khmer # Nd [10] KHMER DIGIT ZERO..KHMER DIGIT NINE -17F0..17F9 ; Khmer # No [10] KHMER SYMBOL LEK ATTAK SON..KHMER SYMBOL LEK ATTAK PRAM-BUON -19E0..19FF ; Khmer # So [32] KHMER SYMBOL PATHAMASAT..KHMER SYMBOL DAP-PRAM ROC - -# Total code points: 146 - -# ================================================ - -1800..1801 ; Mongolian # Po [2] MONGOLIAN BIRGA..MONGOLIAN ELLIPSIS -1804 ; Mongolian # Po MONGOLIAN COLON -1806 ; Mongolian # Pd MONGOLIAN TODO SOFT HYPHEN -1807..180A ; Mongolian # Po [4] MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER..MONGOLIAN NIRUGU -180B..180D ; Mongolian # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE -180E ; Mongolian # Cf MONGOLIAN VOWEL SEPARATOR -1810..1819 ; Mongolian # Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE -1820..1842 ; Mongolian # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI -1843 ; Mongolian # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN -1844..1877 ; Mongolian # Lo [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA -1880..1884 ; Mongolian # Lo [5] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER ALI GALI INVERTED UBADAMA -1885..1886 ; Mongolian # Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA -1887..18A8 ; Mongolian # Lo [34] MONGOLIAN LETTER ALI GALI A..MONGOLIAN LETTER MANCHU ALI GALI BHA -18A9 ; Mongolian # Mn MONGOLIAN LETTER ALI GALI DAGALGA -18AA ; Mongolian # Lo MONGOLIAN LETTER MANCHU ALI GALI LHA -11660..1166C ; Mongolian # Po [13] MONGOLIAN BIRGA WITH ORNAMENT..MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT - -# Total code points: 166 - -# ================================================ - -3041..3096 ; Hiragana # Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE -309D..309E ; Hiragana # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK -309F ; Hiragana # Lo HIRAGANA DIGRAPH YORI -1B001..1B11E ; Hiragana # Lo [286] HIRAGANA LETTER ARCHAIC YE..HENTAIGANA LETTER N-MU-MO-2 -1F200 ; Hiragana # So SQUARE HIRAGANA HOKA - -# Total code points: 376 - -# ================================================ - -30A1..30FA ; Katakana # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO -30FD..30FE ; Katakana # Lm [2] KATAKANA ITERATION MARK..KATAKANA VOICED ITERATION MARK -30FF ; Katakana # Lo KATAKANA DIGRAPH KOTO -31F0..31FF ; Katakana # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO -32D0..32FE ; Katakana # So [47] CIRCLED KATAKANA A..CIRCLED KATAKANA WO -3300..3357 ; Katakana # So [88] SQUARE APAATO..SQUARE WATTO -FF66..FF6F ; Katakana # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU -FF71..FF9D ; Katakana # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N -1B000 ; Katakana # Lo KATAKANA LETTER ARCHAIC E - -# Total code points: 300 - -# ================================================ - -02EA..02EB ; Bopomofo # Sk [2] MODIFIER LETTER YIN DEPARTING TONE MARK..MODIFIER LETTER YANG DEPARTING TONE MARK -3105..312E ; Bopomofo # Lo [42] BOPOMOFO LETTER B..BOPOMOFO LETTER O WITH DOT ABOVE -31A0..31BA ; Bopomofo # Lo [27] BOPOMOFO LETTER BU..BOPOMOFO LETTER ZY - -# Total code points: 71 - -# ================================================ - -2E80..2E99 ; Han # So [26] CJK RADICAL REPEAT..CJK RADICAL RAP -2E9B..2EF3 ; Han # So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE -2F00..2FD5 ; Han # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE -3005 ; Han # Lm IDEOGRAPHIC ITERATION MARK -3007 ; Han # Nl IDEOGRAPHIC NUMBER ZERO -3021..3029 ; Han # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE -3038..303A ; Han # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY -303B ; Han # Lm VERTICAL IDEOGRAPHIC ITERATION MARK -3400..4DB5 ; Han # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5 -4E00..9FEA ; Han # Lo [20971] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FEA -F900..FA6D ; Han # Lo [366] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA6D -FA70..FAD9 ; Han # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9 -20000..2A6D6 ; Han # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 -2A700..2B734 ; Han # Lo [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734 -2B740..2B81D ; Han # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D -2B820..2CEA1 ; Han # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 -2CEB0..2EBE0 ; Han # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 -2F800..2FA1D ; Han # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D - -# Total code points: 89228 - -# ================================================ - -A000..A014 ; Yi # Lo [21] YI SYLLABLE IT..YI SYLLABLE E -A015 ; Yi # Lm YI SYLLABLE WU -A016..A48C ; Yi # Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR -A490..A4C6 ; Yi # So [55] YI RADICAL QOT..YI RADICAL KE - -# Total code points: 1220 - -# ================================================ - -10300..1031F ; Old_Italic # Lo [32] OLD ITALIC LETTER A..OLD ITALIC LETTER ESS -10320..10323 ; Old_Italic # No [4] OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY -1032D..1032F ; Old_Italic # Lo [3] OLD ITALIC LETTER YE..OLD ITALIC LETTER SOUTHERN TSE - -# Total code points: 39 - -# ================================================ - -10330..10340 ; Gothic # Lo [17] GOTHIC LETTER AHSA..GOTHIC LETTER PAIRTHRA -10341 ; Gothic # Nl GOTHIC LETTER NINETY -10342..10349 ; Gothic # Lo [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL -1034A ; Gothic # Nl GOTHIC LETTER NINE HUNDRED - -# Total code points: 27 - -# ================================================ - -10400..1044F ; Deseret # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW - -# Total code points: 80 - -# ================================================ - -0300..036F ; Inherited # Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X -0485..0486 ; Inherited # Mn [2] COMBINING CYRILLIC DASIA PNEUMATA..COMBINING CYRILLIC PSILI PNEUMATA -064B..0655 ; Inherited # Mn [11] ARABIC FATHATAN..ARABIC HAMZA BELOW -0670 ; Inherited # Mn ARABIC LETTER SUPERSCRIPT ALEF -0951..0952 ; Inherited # Mn [2] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI STRESS SIGN ANUDATTA -1AB0..1ABD ; Inherited # Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW -1ABE ; Inherited # Me COMBINING PARENTHESES OVERLAY -1CD0..1CD2 ; Inherited # Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA -1CD4..1CE0 ; Inherited # Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA -1CE2..1CE8 ; Inherited # Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL -1CED ; Inherited # Mn VEDIC SIGN TIRYAK -1CF4 ; Inherited # Mn VEDIC TONE CANDRA ABOVE -1CF8..1CF9 ; Inherited # Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE -1DC0..1DF9 ; Inherited # Mn [58] COMBINING DOTTED GRAVE ACCENT..COMBINING WIDE INVERTED BRIDGE BELOW -1DFB..1DFF ; Inherited # Mn [5] COMBINING DELETION MARK..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW -200C..200D ; Inherited # Cf [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER -20D0..20DC ; Inherited # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE -20DD..20E0 ; Inherited # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH -20E1 ; Inherited # Mn COMBINING LEFT RIGHT ARROW ABOVE -20E2..20E4 ; Inherited # Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE -20E5..20F0 ; Inherited # Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE -302A..302D ; Inherited # Mn [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK -3099..309A ; Inherited # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK -FE00..FE0F ; Inherited # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 -FE20..FE2D ; Inherited # Mn [14] COMBINING LIGATURE LEFT HALF..COMBINING CONJOINING MACRON BELOW -101FD ; Inherited # Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE -102E0 ; Inherited # Mn COPTIC EPACT THOUSANDS MARK -1D167..1D169 ; Inherited # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 -1D17B..1D182 ; Inherited # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE -1D185..1D18B ; Inherited # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE -1D1AA..1D1AD ; Inherited # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO -E0100..E01EF ; Inherited # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 - -# Total code points: 568 - -# ================================================ - -1700..170C ; Tagalog # Lo [13] TAGALOG LETTER A..TAGALOG LETTER YA -170E..1711 ; Tagalog # Lo [4] TAGALOG LETTER LA..TAGALOG LETTER HA -1712..1714 ; Tagalog # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA - -# Total code points: 20 - -# ================================================ - -1720..1731 ; Hanunoo # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA -1732..1734 ; Hanunoo # Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD - -# Total code points: 21 - -# ================================================ - -1740..1751 ; Buhid # Lo [18] BUHID LETTER A..BUHID LETTER HA -1752..1753 ; Buhid # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U - -# Total code points: 20 - -# ================================================ - -1760..176C ; Tagbanwa # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA -176E..1770 ; Tagbanwa # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA -1772..1773 ; Tagbanwa # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U - -# Total code points: 18 - -# ================================================ - -1900..191E ; Limbu # Lo [31] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER TRA -1920..1922 ; Limbu # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U -1923..1926 ; Limbu # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU -1927..1928 ; Limbu # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O -1929..192B ; Limbu # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA -1930..1931 ; Limbu # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA -1932 ; Limbu # Mn LIMBU SMALL LETTER ANUSVARA -1933..1938 ; Limbu # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA -1939..193B ; Limbu # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I -1940 ; Limbu # So LIMBU SIGN LOO -1944..1945 ; Limbu # Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK -1946..194F ; Limbu # Nd [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE - -# Total code points: 68 - -# ================================================ - -1950..196D ; Tai_Le # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI -1970..1974 ; Tai_Le # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 - -# Total code points: 35 - -# ================================================ - -10000..1000B ; Linear_B # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE -1000D..10026 ; Linear_B # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO -10028..1003A ; Linear_B # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO -1003C..1003D ; Linear_B # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE -1003F..1004D ; Linear_B # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO -10050..1005D ; Linear_B # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 -10080..100FA ; Linear_B # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 - -# Total code points: 211 - -# ================================================ - -10380..1039D ; Ugaritic # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU -1039F ; Ugaritic # Po UGARITIC WORD DIVIDER - -# Total code points: 31 - -# ================================================ - -10450..1047F ; Shavian # Lo [48] SHAVIAN LETTER PEEP..SHAVIAN LETTER YEW - -# Total code points: 48 - -# ================================================ - -10480..1049D ; Osmanya # Lo [30] OSMANYA LETTER ALEF..OSMANYA LETTER OO -104A0..104A9 ; Osmanya # Nd [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE - -# Total code points: 40 - -# ================================================ - -10800..10805 ; Cypriot # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA -10808 ; Cypriot # Lo CYPRIOT SYLLABLE JO -1080A..10835 ; Cypriot # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO -10837..10838 ; Cypriot # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE -1083C ; Cypriot # Lo CYPRIOT SYLLABLE ZA -1083F ; Cypriot # Lo CYPRIOT SYLLABLE ZO - -# Total code points: 55 - -# ================================================ - -2800..28FF ; Braille # So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678 - -# Total code points: 256 - -# ================================================ - -1A00..1A16 ; Buginese # Lo [23] BUGINESE LETTER KA..BUGINESE LETTER HA -1A17..1A18 ; Buginese # Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U -1A19..1A1A ; Buginese # Mc [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O -1A1B ; Buginese # Mn BUGINESE VOWEL SIGN AE -1A1E..1A1F ; Buginese # Po [2] BUGINESE PALLAWA..BUGINESE END OF SECTION - -# Total code points: 30 - -# ================================================ - -03E2..03EF ; Coptic # L& [14] COPTIC CAPITAL LETTER SHEI..COPTIC SMALL LETTER DEI -2C80..2CE4 ; Coptic # L& [101] COPTIC CAPITAL LETTER ALFA..COPTIC SYMBOL KAI -2CE5..2CEA ; Coptic # So [6] COPTIC SYMBOL MI RO..COPTIC SYMBOL SHIMA SIMA -2CEB..2CEE ; Coptic # L& [4] COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI..COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA -2CEF..2CF1 ; Coptic # Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS -2CF2..2CF3 ; Coptic # L& [2] COPTIC CAPITAL LETTER BOHAIRIC KHEI..COPTIC SMALL LETTER BOHAIRIC KHEI -2CF9..2CFC ; Coptic # Po [4] COPTIC OLD NUBIAN FULL STOP..COPTIC OLD NUBIAN VERSE DIVIDER -2CFD ; Coptic # No COPTIC FRACTION ONE HALF -2CFE..2CFF ; Coptic # Po [2] COPTIC FULL STOP..COPTIC MORPHOLOGICAL DIVIDER - -# Total code points: 137 - -# ================================================ - -1980..19AB ; New_Tai_Lue # Lo [44] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW SUA -19B0..19C9 ; New_Tai_Lue # Lo [26] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE TONE MARK-2 -19D0..19D9 ; New_Tai_Lue # Nd [10] NEW TAI LUE DIGIT ZERO..NEW TAI LUE DIGIT NINE -19DA ; New_Tai_Lue # No NEW TAI LUE THAM DIGIT ONE -19DE..19DF ; New_Tai_Lue # So [2] NEW TAI LUE SIGN LAE..NEW TAI LUE SIGN LAEV - -# Total code points: 83 - -# ================================================ - -2C00..2C2E ; Glagolitic # L& [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE -2C30..2C5E ; Glagolitic # L& [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE -1E000..1E006 ; Glagolitic # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE -1E008..1E018 ; Glagolitic # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU -1E01B..1E021 ; Glagolitic # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI -1E023..1E024 ; Glagolitic # Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS -1E026..1E02A ; Glagolitic # Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA - -# Total code points: 132 - -# ================================================ - -2D30..2D67 ; Tifinagh # Lo [56] TIFINAGH LETTER YA..TIFINAGH LETTER YO -2D6F ; Tifinagh # Lm TIFINAGH MODIFIER LETTER LABIALIZATION MARK -2D70 ; Tifinagh # Po TIFINAGH SEPARATOR MARK -2D7F ; Tifinagh # Mn TIFINAGH CONSONANT JOINER - -# Total code points: 59 - -# ================================================ - -A800..A801 ; Syloti_Nagri # Lo [2] SYLOTI NAGRI LETTER A..SYLOTI NAGRI LETTER I -A802 ; Syloti_Nagri # Mn SYLOTI NAGRI SIGN DVISVARA -A803..A805 ; Syloti_Nagri # Lo [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O -A806 ; Syloti_Nagri # Mn SYLOTI NAGRI SIGN HASANTA -A807..A80A ; Syloti_Nagri # Lo [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO -A80B ; Syloti_Nagri # Mn SYLOTI NAGRI SIGN ANUSVARA -A80C..A822 ; Syloti_Nagri # Lo [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO -A823..A824 ; Syloti_Nagri # Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I -A825..A826 ; Syloti_Nagri # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E -A827 ; Syloti_Nagri # Mc SYLOTI NAGRI VOWEL SIGN OO -A828..A82B ; Syloti_Nagri # So [4] SYLOTI NAGRI POETRY MARK-1..SYLOTI NAGRI POETRY MARK-4 - -# Total code points: 44 - -# ================================================ - -103A0..103C3 ; Old_Persian # Lo [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA -103C8..103CF ; Old_Persian # Lo [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH -103D0 ; Old_Persian # Po OLD PERSIAN WORD DIVIDER -103D1..103D5 ; Old_Persian # Nl [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED - -# Total code points: 50 - -# ================================================ - -10A00 ; Kharoshthi # Lo KHAROSHTHI LETTER A -10A01..10A03 ; Kharoshthi # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R -10A05..10A06 ; Kharoshthi # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O -10A0C..10A0F ; Kharoshthi # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA -10A10..10A13 ; Kharoshthi # Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA -10A15..10A17 ; Kharoshthi # Lo [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA -10A19..10A33 ; Kharoshthi # Lo [27] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER TTTHA -10A38..10A3A ; Kharoshthi # Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW -10A3F ; Kharoshthi # Mn KHAROSHTHI VIRAMA -10A40..10A47 ; Kharoshthi # No [8] KHAROSHTHI DIGIT ONE..KHAROSHTHI NUMBER ONE THOUSAND -10A50..10A58 ; Kharoshthi # Po [9] KHAROSHTHI PUNCTUATION DOT..KHAROSHTHI PUNCTUATION LINES - -# Total code points: 65 - -# ================================================ - -1B00..1B03 ; Balinese # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG -1B04 ; Balinese # Mc BALINESE SIGN BISAH -1B05..1B33 ; Balinese # Lo [47] BALINESE LETTER AKARA..BALINESE LETTER HA -1B34 ; Balinese # Mn BALINESE SIGN REREKAN -1B35 ; Balinese # Mc BALINESE VOWEL SIGN TEDUNG -1B36..1B3A ; Balinese # Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA -1B3B ; Balinese # Mc BALINESE VOWEL SIGN RA REPA TEDUNG -1B3C ; Balinese # Mn BALINESE VOWEL SIGN LA LENGA -1B3D..1B41 ; Balinese # Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG -1B42 ; Balinese # Mn BALINESE VOWEL SIGN PEPET -1B43..1B44 ; Balinese # Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG -1B45..1B4B ; Balinese # Lo [7] BALINESE LETTER KAF SASAK..BALINESE LETTER ASYURA SASAK -1B50..1B59 ; Balinese # Nd [10] BALINESE DIGIT ZERO..BALINESE DIGIT NINE -1B5A..1B60 ; Balinese # Po [7] BALINESE PANTI..BALINESE PAMENENG -1B61..1B6A ; Balinese # So [10] BALINESE MUSICAL SYMBOL DONG..BALINESE MUSICAL SYMBOL DANG GEDE -1B6B..1B73 ; Balinese # Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG -1B74..1B7C ; Balinese # So [9] BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG..BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING - -# Total code points: 121 - -# ================================================ - -12000..12399 ; Cuneiform # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U -12400..1246E ; Cuneiform # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM -12470..12474 ; Cuneiform # Po [5] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON -12480..12543 ; Cuneiform # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU - -# Total code points: 1234 - -# ================================================ - -10900..10915 ; Phoenician # Lo [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU -10916..1091B ; Phoenician # No [6] PHOENICIAN NUMBER ONE..PHOENICIAN NUMBER THREE -1091F ; Phoenician # Po PHOENICIAN WORD SEPARATOR - -# Total code points: 29 - -# ================================================ - -A840..A873 ; Phags_Pa # Lo [52] PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU -A874..A877 ; Phags_Pa # Po [4] PHAGS-PA SINGLE HEAD MARK..PHAGS-PA MARK DOUBLE SHAD - -# Total code points: 56 - -# ================================================ - -07C0..07C9 ; Nko # Nd [10] NKO DIGIT ZERO..NKO DIGIT NINE -07CA..07EA ; Nko # Lo [33] NKO LETTER A..NKO LETTER JONA RA -07EB..07F3 ; Nko # Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE -07F4..07F5 ; Nko # Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE -07F6 ; Nko # So NKO SYMBOL OO DENNEN -07F7..07F9 ; Nko # Po [3] NKO SYMBOL GBAKURUNEN..NKO EXCLAMATION MARK -07FA ; Nko # Lm NKO LAJANYALAN - -# Total code points: 59 - -# ================================================ - -1B80..1B81 ; Sundanese # Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR -1B82 ; Sundanese # Mc SUNDANESE SIGN PANGWISAD -1B83..1BA0 ; Sundanese # Lo [30] SUNDANESE LETTER A..SUNDANESE LETTER HA -1BA1 ; Sundanese # Mc SUNDANESE CONSONANT SIGN PAMINGKAL -1BA2..1BA5 ; Sundanese # Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU -1BA6..1BA7 ; Sundanese # Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG -1BA8..1BA9 ; Sundanese # Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG -1BAA ; Sundanese # Mc SUNDANESE SIGN PAMAAEH -1BAB..1BAD ; Sundanese # Mn [3] SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT SIGN PASANGAN WA -1BAE..1BAF ; Sundanese # Lo [2] SUNDANESE LETTER KHA..SUNDANESE LETTER SYA -1BB0..1BB9 ; Sundanese # Nd [10] SUNDANESE DIGIT ZERO..SUNDANESE DIGIT NINE -1BBA..1BBF ; Sundanese # Lo [6] SUNDANESE AVAGRAHA..SUNDANESE LETTER FINAL M -1CC0..1CC7 ; Sundanese # Po [8] SUNDANESE PUNCTUATION BINDU SURYA..SUNDANESE PUNCTUATION BINDU BA SATANGA - -# Total code points: 72 - -# ================================================ - -1C00..1C23 ; Lepcha # Lo [36] LEPCHA LETTER KA..LEPCHA LETTER A -1C24..1C2B ; Lepcha # Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU -1C2C..1C33 ; Lepcha # Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T -1C34..1C35 ; Lepcha # Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG -1C36..1C37 ; Lepcha # Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA -1C3B..1C3F ; Lepcha # Po [5] LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION TSHOOK -1C40..1C49 ; Lepcha # Nd [10] LEPCHA DIGIT ZERO..LEPCHA DIGIT NINE -1C4D..1C4F ; Lepcha # Lo [3] LEPCHA LETTER TTA..LEPCHA LETTER DDA - -# Total code points: 74 - -# ================================================ - -1C50..1C59 ; Ol_Chiki # Nd [10] OL CHIKI DIGIT ZERO..OL CHIKI DIGIT NINE -1C5A..1C77 ; Ol_Chiki # Lo [30] OL CHIKI LETTER LA..OL CHIKI LETTER OH -1C78..1C7D ; Ol_Chiki # Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD -1C7E..1C7F ; Ol_Chiki # Po [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD - -# Total code points: 48 - -# ================================================ - -A500..A60B ; Vai # Lo [268] VAI SYLLABLE EE..VAI SYLLABLE NG -A60C ; Vai # Lm VAI SYLLABLE LENGTHENER -A60D..A60F ; Vai # Po [3] VAI COMMA..VAI QUESTION MARK -A610..A61F ; Vai # Lo [16] VAI SYLLABLE NDOLE FA..VAI SYMBOL JONG -A620..A629 ; Vai # Nd [10] VAI DIGIT ZERO..VAI DIGIT NINE -A62A..A62B ; Vai # Lo [2] VAI SYLLABLE NDOLE MA..VAI SYLLABLE NDOLE DO - -# Total code points: 300 - -# ================================================ - -A880..A881 ; Saurashtra # Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA -A882..A8B3 ; Saurashtra # Lo [50] SAURASHTRA LETTER A..SAURASHTRA LETTER LLA -A8B4..A8C3 ; Saurashtra # Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU -A8C4..A8C5 ; Saurashtra # Mn [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU -A8CE..A8CF ; Saurashtra # Po [2] SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA -A8D0..A8D9 ; Saurashtra # Nd [10] SAURASHTRA DIGIT ZERO..SAURASHTRA DIGIT NINE - -# Total code points: 82 - -# ================================================ - -A900..A909 ; Kayah_Li # Nd [10] KAYAH LI DIGIT ZERO..KAYAH LI DIGIT NINE -A90A..A925 ; Kayah_Li # Lo [28] KAYAH LI LETTER KA..KAYAH LI LETTER OO -A926..A92D ; Kayah_Li # Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU -A92F ; Kayah_Li # Po KAYAH LI SIGN SHYA - -# Total code points: 47 - -# ================================================ - -A930..A946 ; Rejang # Lo [23] REJANG LETTER KA..REJANG LETTER A -A947..A951 ; Rejang # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R -A952..A953 ; Rejang # Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA -A95F ; Rejang # Po REJANG SECTION MARK - -# Total code points: 37 - -# ================================================ - -10280..1029C ; Lycian # Lo [29] LYCIAN LETTER A..LYCIAN LETTER X - -# Total code points: 29 - -# ================================================ - -102A0..102D0 ; Carian # Lo [49] CARIAN LETTER A..CARIAN LETTER UUU3 - -# Total code points: 49 - -# ================================================ - -10920..10939 ; Lydian # Lo [26] LYDIAN LETTER A..LYDIAN LETTER C -1093F ; Lydian # Po LYDIAN TRIANGULAR MARK - -# Total code points: 27 - -# ================================================ - -AA00..AA28 ; Cham # Lo [41] CHAM LETTER A..CHAM LETTER HA -AA29..AA2E ; Cham # Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE -AA2F..AA30 ; Cham # Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI -AA31..AA32 ; Cham # Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE -AA33..AA34 ; Cham # Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA -AA35..AA36 ; Cham # Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA -AA40..AA42 ; Cham # Lo [3] CHAM LETTER FINAL K..CHAM LETTER FINAL NG -AA43 ; Cham # Mn CHAM CONSONANT SIGN FINAL NG -AA44..AA4B ; Cham # Lo [8] CHAM LETTER FINAL CH..CHAM LETTER FINAL SS -AA4C ; Cham # Mn CHAM CONSONANT SIGN FINAL M -AA4D ; Cham # Mc CHAM CONSONANT SIGN FINAL H -AA50..AA59 ; Cham # Nd [10] CHAM DIGIT ZERO..CHAM DIGIT NINE -AA5C..AA5F ; Cham # Po [4] CHAM PUNCTUATION SPIRAL..CHAM PUNCTUATION TRIPLE DANDA - -# Total code points: 83 - -# ================================================ - -1A20..1A54 ; Tai_Tham # Lo [53] TAI THAM LETTER HIGH KA..TAI THAM LETTER GREAT SA -1A55 ; Tai_Tham # Mc TAI THAM CONSONANT SIGN MEDIAL RA -1A56 ; Tai_Tham # Mn TAI THAM CONSONANT SIGN MEDIAL LA -1A57 ; Tai_Tham # Mc TAI THAM CONSONANT SIGN LA TANG LAI -1A58..1A5E ; Tai_Tham # Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA -1A60 ; Tai_Tham # Mn TAI THAM SIGN SAKOT -1A61 ; Tai_Tham # Mc TAI THAM VOWEL SIGN A -1A62 ; Tai_Tham # Mn TAI THAM VOWEL SIGN MAI SAT -1A63..1A64 ; Tai_Tham # Mc [2] TAI THAM VOWEL SIGN AA..TAI THAM VOWEL SIGN TALL AA -1A65..1A6C ; Tai_Tham # Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW -1A6D..1A72 ; Tai_Tham # Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI -1A73..1A7C ; Tai_Tham # Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN -1A7F ; Tai_Tham # Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT -1A80..1A89 ; Tai_Tham # Nd [10] TAI THAM HORA DIGIT ZERO..TAI THAM HORA DIGIT NINE -1A90..1A99 ; Tai_Tham # Nd [10] TAI THAM THAM DIGIT ZERO..TAI THAM THAM DIGIT NINE -1AA0..1AA6 ; Tai_Tham # Po [7] TAI THAM SIGN WIANG..TAI THAM SIGN REVERSED ROTATED RANA -1AA7 ; Tai_Tham # Lm TAI THAM SIGN MAI YAMOK -1AA8..1AAD ; Tai_Tham # Po [6] TAI THAM SIGN KAAN..TAI THAM SIGN CAANG - -# Total code points: 127 - -# ================================================ - -AA80..AAAF ; Tai_Viet # Lo [48] TAI VIET LETTER LOW KO..TAI VIET LETTER HIGH O -AAB0 ; Tai_Viet # Mn TAI VIET MAI KANG -AAB1 ; Tai_Viet # Lo TAI VIET VOWEL AA -AAB2..AAB4 ; Tai_Viet # Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U -AAB5..AAB6 ; Tai_Viet # Lo [2] TAI VIET VOWEL E..TAI VIET VOWEL O -AAB7..AAB8 ; Tai_Viet # Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA -AAB9..AABD ; Tai_Viet # Lo [5] TAI VIET VOWEL UEA..TAI VIET VOWEL AN -AABE..AABF ; Tai_Viet # Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK -AAC0 ; Tai_Viet # Lo TAI VIET TONE MAI NUENG -AAC1 ; Tai_Viet # Mn TAI VIET TONE MAI THO -AAC2 ; Tai_Viet # Lo TAI VIET TONE MAI SONG -AADB..AADC ; Tai_Viet # Lo [2] TAI VIET SYMBOL KON..TAI VIET SYMBOL NUENG -AADD ; Tai_Viet # Lm TAI VIET SYMBOL SAM -AADE..AADF ; Tai_Viet # Po [2] TAI VIET SYMBOL HO HOI..TAI VIET SYMBOL KOI KOI - -# Total code points: 72 - -# ================================================ - -10B00..10B35 ; Avestan # Lo [54] AVESTAN LETTER A..AVESTAN LETTER HE -10B39..10B3F ; Avestan # Po [7] AVESTAN ABBREVIATION MARK..LARGE ONE RING OVER TWO RINGS PUNCTUATION - -# Total code points: 61 - -# ================================================ - -13000..1342E ; Egyptian_Hieroglyphs # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH AA032 - -# Total code points: 1071 - -# ================================================ - -0800..0815 ; Samaritan # Lo [22] SAMARITAN LETTER ALAF..SAMARITAN LETTER TAAF -0816..0819 ; Samaritan # Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH -081A ; Samaritan # Lm SAMARITAN MODIFIER LETTER EPENTHETIC YUT -081B..0823 ; Samaritan # Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A -0824 ; Samaritan # Lm SAMARITAN MODIFIER LETTER SHORT A -0825..0827 ; Samaritan # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U -0828 ; Samaritan # Lm SAMARITAN MODIFIER LETTER I -0829..082D ; Samaritan # Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA -0830..083E ; Samaritan # Po [15] SAMARITAN PUNCTUATION NEQUDAA..SAMARITAN PUNCTUATION ANNAAU - -# Total code points: 61 - -# ================================================ - -A4D0..A4F7 ; Lisu # Lo [40] LISU LETTER BA..LISU LETTER OE -A4F8..A4FD ; Lisu # Lm [6] LISU LETTER TONE MYA TI..LISU LETTER TONE MYA JEU -A4FE..A4FF ; Lisu # Po [2] LISU PUNCTUATION COMMA..LISU PUNCTUATION FULL STOP - -# Total code points: 48 - -# ================================================ - -A6A0..A6E5 ; Bamum # Lo [70] BAMUM LETTER A..BAMUM LETTER KI -A6E6..A6EF ; Bamum # Nl [10] BAMUM LETTER MO..BAMUM LETTER KOGHOM -A6F0..A6F1 ; Bamum # Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS -A6F2..A6F7 ; Bamum # Po [6] BAMUM NJAEMLI..BAMUM QUESTION MARK -16800..16A38 ; Bamum # Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ - -# Total code points: 657 - -# ================================================ - -A980..A982 ; Javanese # Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR -A983 ; Javanese # Mc JAVANESE SIGN WIGNYAN -A984..A9B2 ; Javanese # Lo [47] JAVANESE LETTER A..JAVANESE LETTER HA -A9B3 ; Javanese # Mn JAVANESE SIGN CECAK TELU -A9B4..A9B5 ; Javanese # Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG -A9B6..A9B9 ; Javanese # Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT -A9BA..A9BB ; Javanese # Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE -A9BC ; Javanese # Mn JAVANESE VOWEL SIGN PEPET -A9BD..A9C0 ; Javanese # Mc [4] JAVANESE CONSONANT SIGN KERET..JAVANESE PANGKON -A9C1..A9CD ; Javanese # Po [13] JAVANESE LEFT RERENGGAN..JAVANESE TURNED PADA PISELEH -A9D0..A9D9 ; Javanese # Nd [10] JAVANESE DIGIT ZERO..JAVANESE DIGIT NINE -A9DE..A9DF ; Javanese # Po [2] JAVANESE PADA TIRTA TUMETES..JAVANESE PADA ISEN-ISEN - -# Total code points: 90 - -# ================================================ - -AAE0..AAEA ; Meetei_Mayek # Lo [11] MEETEI MAYEK LETTER E..MEETEI MAYEK LETTER SSA -AAEB ; Meetei_Mayek # Mc MEETEI MAYEK VOWEL SIGN II -AAEC..AAED ; Meetei_Mayek # Mn [2] MEETEI MAYEK VOWEL SIGN UU..MEETEI MAYEK VOWEL SIGN AAI -AAEE..AAEF ; Meetei_Mayek # Mc [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN AAU -AAF0..AAF1 ; Meetei_Mayek # Po [2] MEETEI MAYEK CHEIKHAN..MEETEI MAYEK AHANG KHUDAM -AAF2 ; Meetei_Mayek # Lo MEETEI MAYEK ANJI -AAF3..AAF4 ; Meetei_Mayek # Lm [2] MEETEI MAYEK SYLLABLE REPETITION MARK..MEETEI MAYEK WORD REPETITION MARK -AAF5 ; Meetei_Mayek # Mc MEETEI MAYEK VOWEL SIGN VISARGA -AAF6 ; Meetei_Mayek # Mn MEETEI MAYEK VIRAMA -ABC0..ABE2 ; Meetei_Mayek # Lo [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM -ABE3..ABE4 ; Meetei_Mayek # Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP -ABE5 ; Meetei_Mayek # Mn MEETEI MAYEK VOWEL SIGN ANAP -ABE6..ABE7 ; Meetei_Mayek # Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP -ABE8 ; Meetei_Mayek # Mn MEETEI MAYEK VOWEL SIGN UNAP -ABE9..ABEA ; Meetei_Mayek # Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG -ABEB ; Meetei_Mayek # Po MEETEI MAYEK CHEIKHEI -ABEC ; Meetei_Mayek # Mc MEETEI MAYEK LUM IYEK -ABED ; Meetei_Mayek # Mn MEETEI MAYEK APUN IYEK -ABF0..ABF9 ; Meetei_Mayek # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DIGIT NINE - -# Total code points: 79 - -# ================================================ - -10840..10855 ; Imperial_Aramaic # Lo [22] IMPERIAL ARAMAIC LETTER ALEPH..IMPERIAL ARAMAIC LETTER TAW -10857 ; Imperial_Aramaic # Po IMPERIAL ARAMAIC SECTION SIGN -10858..1085F ; Imperial_Aramaic # No [8] IMPERIAL ARAMAIC NUMBER ONE..IMPERIAL ARAMAIC NUMBER TEN THOUSAND - -# Total code points: 31 - -# ================================================ - -10A60..10A7C ; Old_South_Arabian # Lo [29] OLD SOUTH ARABIAN LETTER HE..OLD SOUTH ARABIAN LETTER THETH -10A7D..10A7E ; Old_South_Arabian # No [2] OLD SOUTH ARABIAN NUMBER ONE..OLD SOUTH ARABIAN NUMBER FIFTY -10A7F ; Old_South_Arabian # Po OLD SOUTH ARABIAN NUMERIC INDICATOR - -# Total code points: 32 - -# ================================================ - -10B40..10B55 ; Inscriptional_Parthian # Lo [22] INSCRIPTIONAL PARTHIAN LETTER ALEPH..INSCRIPTIONAL PARTHIAN LETTER TAW -10B58..10B5F ; Inscriptional_Parthian # No [8] INSCRIPTIONAL PARTHIAN NUMBER ONE..INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND - -# Total code points: 30 - -# ================================================ - -10B60..10B72 ; Inscriptional_Pahlavi # Lo [19] INSCRIPTIONAL PAHLAVI LETTER ALEPH..INSCRIPTIONAL PAHLAVI LETTER TAW -10B78..10B7F ; Inscriptional_Pahlavi # No [8] INSCRIPTIONAL PAHLAVI NUMBER ONE..INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND - -# Total code points: 27 - -# ================================================ - -10C00..10C48 ; Old_Turkic # Lo [73] OLD TURKIC LETTER ORKHON A..OLD TURKIC LETTER ORKHON BASH - -# Total code points: 73 - -# ================================================ - -11080..11081 ; Kaithi # Mn [2] KAITHI SIGN CANDRABINDU..KAITHI SIGN ANUSVARA -11082 ; Kaithi # Mc KAITHI SIGN VISARGA -11083..110AF ; Kaithi # Lo [45] KAITHI LETTER A..KAITHI LETTER HA -110B0..110B2 ; Kaithi # Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II -110B3..110B6 ; Kaithi # Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI -110B7..110B8 ; Kaithi # Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU -110B9..110BA ; Kaithi # Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA -110BB..110BC ; Kaithi # Po [2] KAITHI ABBREVIATION SIGN..KAITHI ENUMERATION SIGN -110BD ; Kaithi # Cf KAITHI NUMBER SIGN -110BE..110C1 ; Kaithi # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA - -# Total code points: 66 - -# ================================================ - -1BC0..1BE5 ; Batak # Lo [38] BATAK LETTER A..BATAK LETTER U -1BE6 ; Batak # Mn BATAK SIGN TOMPI -1BE7 ; Batak # Mc BATAK VOWEL SIGN E -1BE8..1BE9 ; Batak # Mn [2] BATAK VOWEL SIGN PAKPAK E..BATAK VOWEL SIGN EE -1BEA..1BEC ; Batak # Mc [3] BATAK VOWEL SIGN I..BATAK VOWEL SIGN O -1BED ; Batak # Mn BATAK VOWEL SIGN KARO O -1BEE ; Batak # Mc BATAK VOWEL SIGN U -1BEF..1BF1 ; Batak # Mn [3] BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H -1BF2..1BF3 ; Batak # Mc [2] BATAK PANGOLAT..BATAK PANONGONAN -1BFC..1BFF ; Batak # Po [4] BATAK SYMBOL BINDU NA METEK..BATAK SYMBOL BINDU PANGOLAT - -# Total code points: 56 - -# ================================================ - -11000 ; Brahmi # Mc BRAHMI SIGN CANDRABINDU -11001 ; Brahmi # Mn BRAHMI SIGN ANUSVARA -11002 ; Brahmi # Mc BRAHMI SIGN VISARGA -11003..11037 ; Brahmi # Lo [53] BRAHMI SIGN JIHVAMULIYA..BRAHMI LETTER OLD TAMIL NNNA -11038..11046 ; Brahmi # Mn [15] BRAHMI VOWEL SIGN AA..BRAHMI VIRAMA -11047..1104D ; Brahmi # Po [7] BRAHMI DANDA..BRAHMI PUNCTUATION LOTUS -11052..11065 ; Brahmi # No [20] BRAHMI NUMBER ONE..BRAHMI NUMBER ONE THOUSAND -11066..1106F ; Brahmi # Nd [10] BRAHMI DIGIT ZERO..BRAHMI DIGIT NINE -1107F ; Brahmi # Mn BRAHMI NUMBER JOINER - -# Total code points: 109 - -# ================================================ - -0840..0858 ; Mandaic # Lo [25] MANDAIC LETTER HALQA..MANDAIC LETTER AIN -0859..085B ; Mandaic # Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK -085E ; Mandaic # Po MANDAIC PUNCTUATION - -# Total code points: 29 - -# ================================================ - -11100..11102 ; Chakma # Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA -11103..11126 ; Chakma # Lo [36] CHAKMA LETTER AA..CHAKMA LETTER HAA -11127..1112B ; Chakma # Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU -1112C ; Chakma # Mc CHAKMA VOWEL SIGN E -1112D..11134 ; Chakma # Mn [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA -11136..1113F ; Chakma # Nd [10] CHAKMA DIGIT ZERO..CHAKMA DIGIT NINE -11140..11143 ; Chakma # Po [4] CHAKMA SECTION MARK..CHAKMA QUESTION MARK - -# Total code points: 67 - -# ================================================ - -109A0..109B7 ; Meroitic_Cursive # Lo [24] MEROITIC CURSIVE LETTER A..MEROITIC CURSIVE LETTER DA -109BC..109BD ; Meroitic_Cursive # No [2] MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS..MEROITIC CURSIVE FRACTION ONE HALF -109BE..109BF ; Meroitic_Cursive # Lo [2] MEROITIC CURSIVE LOGOGRAM RMT..MEROITIC CURSIVE LOGOGRAM IMN -109C0..109CF ; Meroitic_Cursive # No [16] MEROITIC CURSIVE NUMBER ONE..MEROITIC CURSIVE NUMBER SEVENTY -109D2..109FF ; Meroitic_Cursive # No [46] MEROITIC CURSIVE NUMBER ONE HUNDRED..MEROITIC CURSIVE FRACTION TEN TWELFTHS - -# Total code points: 90 - -# ================================================ - -10980..1099F ; Meroitic_Hieroglyphs # Lo [32] MEROITIC HIEROGLYPHIC LETTER A..MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2 - -# Total code points: 32 - -# ================================================ - -16F00..16F44 ; Miao # Lo [69] MIAO LETTER PA..MIAO LETTER HHA -16F50 ; Miao # Lo MIAO LETTER NASALIZATION -16F51..16F7E ; Miao # Mc [46] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN NG -16F8F..16F92 ; Miao # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW -16F93..16F9F ; Miao # Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8 - -# Total code points: 133 - -# ================================================ - -11180..11181 ; Sharada # Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA -11182 ; Sharada # Mc SHARADA SIGN VISARGA -11183..111B2 ; Sharada # Lo [48] SHARADA LETTER A..SHARADA LETTER HA -111B3..111B5 ; Sharada # Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II -111B6..111BE ; Sharada # Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O -111BF..111C0 ; Sharada # Mc [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA -111C1..111C4 ; Sharada # Lo [4] SHARADA SIGN AVAGRAHA..SHARADA OM -111C5..111C9 ; Sharada # Po [5] SHARADA DANDA..SHARADA SANDHI MARK -111CA..111CC ; Sharada # Mn [3] SHARADA SIGN NUKTA..SHARADA EXTRA SHORT VOWEL MARK -111CD ; Sharada # Po SHARADA SUTRA MARK -111D0..111D9 ; Sharada # Nd [10] SHARADA DIGIT ZERO..SHARADA DIGIT NINE -111DA ; Sharada # Lo SHARADA EKAM -111DB ; Sharada # Po SHARADA SIGN SIDDHAM -111DC ; Sharada # Lo SHARADA HEADSTROKE -111DD..111DF ; Sharada # Po [3] SHARADA CONTINUATION SIGN..SHARADA SECTION MARK-2 - -# Total code points: 94 - -# ================================================ - -110D0..110E8 ; Sora_Sompeng # Lo [25] SORA SOMPENG LETTER SAH..SORA SOMPENG LETTER MAE -110F0..110F9 ; Sora_Sompeng # Nd [10] SORA SOMPENG DIGIT ZERO..SORA SOMPENG DIGIT NINE - -# Total code points: 35 - -# ================================================ - -11680..116AA ; Takri # Lo [43] TAKRI LETTER A..TAKRI LETTER RRA -116AB ; Takri # Mn TAKRI SIGN ANUSVARA -116AC ; Takri # Mc TAKRI SIGN VISARGA -116AD ; Takri # Mn TAKRI VOWEL SIGN AA -116AE..116AF ; Takri # Mc [2] TAKRI VOWEL SIGN I..TAKRI VOWEL SIGN II -116B0..116B5 ; Takri # Mn [6] TAKRI VOWEL SIGN U..TAKRI VOWEL SIGN AU -116B6 ; Takri # Mc TAKRI SIGN VIRAMA -116B7 ; Takri # Mn TAKRI SIGN NUKTA -116C0..116C9 ; Takri # Nd [10] TAKRI DIGIT ZERO..TAKRI DIGIT NINE - -# Total code points: 66 - -# ================================================ - -10530..10563 ; Caucasian_Albanian # Lo [52] CAUCASIAN ALBANIAN LETTER ALT..CAUCASIAN ALBANIAN LETTER KIW -1056F ; Caucasian_Albanian # Po CAUCASIAN ALBANIAN CITATION MARK - -# Total code points: 53 - -# ================================================ - -16AD0..16AED ; Bassa_Vah # Lo [30] BASSA VAH LETTER ENNI..BASSA VAH LETTER I -16AF0..16AF4 ; Bassa_Vah # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE -16AF5 ; Bassa_Vah # Po BASSA VAH FULL STOP - -# Total code points: 36 - -# ================================================ - -1BC00..1BC6A ; Duployan # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M -1BC70..1BC7C ; Duployan # Lo [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK -1BC80..1BC88 ; Duployan # Lo [9] DUPLOYAN AFFIX HIGH ACUTE..DUPLOYAN AFFIX HIGH VERTICAL -1BC90..1BC99 ; Duployan # Lo [10] DUPLOYAN AFFIX LOW ACUTE..DUPLOYAN AFFIX LOW ARROW -1BC9C ; Duployan # So DUPLOYAN SIGN O WITH CROSS -1BC9D..1BC9E ; Duployan # Mn [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK -1BC9F ; Duployan # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP - -# Total code points: 143 - -# ================================================ - -10500..10527 ; Elbasan # Lo [40] ELBASAN LETTER A..ELBASAN LETTER KHE - -# Total code points: 40 - -# ================================================ - -11300..11301 ; Grantha # Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU -11302..11303 ; Grantha # Mc [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA -11305..1130C ; Grantha # Lo [8] GRANTHA LETTER A..GRANTHA LETTER VOCALIC L -1130F..11310 ; Grantha # Lo [2] GRANTHA LETTER EE..GRANTHA LETTER AI -11313..11328 ; Grantha # Lo [22] GRANTHA LETTER OO..GRANTHA LETTER NA -1132A..11330 ; Grantha # Lo [7] GRANTHA LETTER PA..GRANTHA LETTER RA -11332..11333 ; Grantha # Lo [2] GRANTHA LETTER LA..GRANTHA LETTER LLA -11335..11339 ; Grantha # Lo [5] GRANTHA LETTER VA..GRANTHA LETTER HA -1133C ; Grantha # Mn GRANTHA SIGN NUKTA -1133D ; Grantha # Lo GRANTHA SIGN AVAGRAHA -1133E..1133F ; Grantha # Mc [2] GRANTHA VOWEL SIGN AA..GRANTHA VOWEL SIGN I -11340 ; Grantha # Mn GRANTHA VOWEL SIGN II -11341..11344 ; Grantha # Mc [4] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN VOCALIC RR -11347..11348 ; Grantha # Mc [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI -1134B..1134D ; Grantha # Mc [3] GRANTHA VOWEL SIGN OO..GRANTHA SIGN VIRAMA -11350 ; Grantha # Lo GRANTHA OM -11357 ; Grantha # Mc GRANTHA AU LENGTH MARK -1135D..11361 ; Grantha # Lo [5] GRANTHA SIGN PLUTA..GRANTHA LETTER VOCALIC LL -11362..11363 ; Grantha # Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL -11366..1136C ; Grantha # Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX -11370..11374 ; Grantha # Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA - -# Total code points: 85 - -# ================================================ - -16B00..16B2F ; Pahawh_Hmong # Lo [48] PAHAWH HMONG VOWEL KEEB..PAHAWH HMONG CONSONANT CAU -16B30..16B36 ; Pahawh_Hmong # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM -16B37..16B3B ; Pahawh_Hmong # Po [5] PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN VOS FEEM -16B3C..16B3F ; Pahawh_Hmong # So [4] PAHAWH HMONG SIGN XYEEM NTXIV..PAHAWH HMONG SIGN XYEEM FAIB -16B40..16B43 ; Pahawh_Hmong # Lm [4] PAHAWH HMONG SIGN VOS SEEV..PAHAWH HMONG SIGN IB YAM -16B44 ; Pahawh_Hmong # Po PAHAWH HMONG SIGN XAUS -16B45 ; Pahawh_Hmong # So PAHAWH HMONG SIGN CIM TSOV ROG -16B50..16B59 ; Pahawh_Hmong # Nd [10] PAHAWH HMONG DIGIT ZERO..PAHAWH HMONG DIGIT NINE -16B5B..16B61 ; Pahawh_Hmong # No [7] PAHAWH HMONG NUMBER TENS..PAHAWH HMONG NUMBER TRILLIONS -16B63..16B77 ; Pahawh_Hmong # Lo [21] PAHAWH HMONG SIGN VOS LUB..PAHAWH HMONG SIGN CIM NRES TOS -16B7D..16B8F ; Pahawh_Hmong # Lo [19] PAHAWH HMONG CLAN SIGN TSHEEJ..PAHAWH HMONG CLAN SIGN VWJ - -# Total code points: 127 - -# ================================================ - -11200..11211 ; Khojki # Lo [18] KHOJKI LETTER A..KHOJKI LETTER JJA -11213..1122B ; Khojki # Lo [25] KHOJKI LETTER NYA..KHOJKI LETTER LLA -1122C..1122E ; Khojki # Mc [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II -1122F..11231 ; Khojki # Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI -11232..11233 ; Khojki # Mc [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU -11234 ; Khojki # Mn KHOJKI SIGN ANUSVARA -11235 ; Khojki # Mc KHOJKI SIGN VIRAMA -11236..11237 ; Khojki # Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA -11238..1123D ; Khojki # Po [6] KHOJKI DANDA..KHOJKI ABBREVIATION SIGN -1123E ; Khojki # Mn KHOJKI SIGN SUKUN - -# Total code points: 62 - -# ================================================ - -10600..10736 ; Linear_A # Lo [311] LINEAR A SIGN AB001..LINEAR A SIGN A664 -10740..10755 ; Linear_A # Lo [22] LINEAR A SIGN A701 A..LINEAR A SIGN A732 JE -10760..10767 ; Linear_A # Lo [8] LINEAR A SIGN A800..LINEAR A SIGN A807 - -# Total code points: 341 - -# ================================================ - -11150..11172 ; Mahajani # Lo [35] MAHAJANI LETTER A..MAHAJANI LETTER RRA -11173 ; Mahajani # Mn MAHAJANI SIGN NUKTA -11174..11175 ; Mahajani # Po [2] MAHAJANI ABBREVIATION SIGN..MAHAJANI SECTION MARK -11176 ; Mahajani # Lo MAHAJANI LIGATURE SHRI - -# Total code points: 39 - -# ================================================ - -10AC0..10AC7 ; Manichaean # Lo [8] MANICHAEAN LETTER ALEPH..MANICHAEAN LETTER WAW -10AC8 ; Manichaean # So MANICHAEAN SIGN UD -10AC9..10AE4 ; Manichaean # Lo [28] MANICHAEAN LETTER ZAYIN..MANICHAEAN LETTER TAW -10AE5..10AE6 ; Manichaean # Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW -10AEB..10AEF ; Manichaean # No [5] MANICHAEAN NUMBER ONE..MANICHAEAN NUMBER ONE HUNDRED -10AF0..10AF6 ; Manichaean # Po [7] MANICHAEAN PUNCTUATION STAR..MANICHAEAN PUNCTUATION LINE FILLER - -# Total code points: 51 - -# ================================================ - -1E800..1E8C4 ; Mende_Kikakui # Lo [197] MENDE KIKAKUI SYLLABLE M001 KI..MENDE KIKAKUI SYLLABLE M060 NYON -1E8C7..1E8CF ; Mende_Kikakui # No [9] MENDE KIKAKUI DIGIT ONE..MENDE KIKAKUI DIGIT NINE -1E8D0..1E8D6 ; Mende_Kikakui # Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS - -# Total code points: 213 - -# ================================================ - -11600..1162F ; Modi # Lo [48] MODI LETTER A..MODI LETTER LLA -11630..11632 ; Modi # Mc [3] MODI VOWEL SIGN AA..MODI VOWEL SIGN II -11633..1163A ; Modi # Mn [8] MODI VOWEL SIGN U..MODI VOWEL SIGN AI -1163B..1163C ; Modi # Mc [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU -1163D ; Modi # Mn MODI SIGN ANUSVARA -1163E ; Modi # Mc MODI SIGN VISARGA -1163F..11640 ; Modi # Mn [2] MODI SIGN VIRAMA..MODI SIGN ARDHACANDRA -11641..11643 ; Modi # Po [3] MODI DANDA..MODI ABBREVIATION SIGN -11644 ; Modi # Lo MODI SIGN HUVA -11650..11659 ; Modi # Nd [10] MODI DIGIT ZERO..MODI DIGIT NINE - -# Total code points: 79 - -# ================================================ - -16A40..16A5E ; Mro # Lo [31] MRO LETTER TA..MRO LETTER TEK -16A60..16A69 ; Mro # Nd [10] MRO DIGIT ZERO..MRO DIGIT NINE -16A6E..16A6F ; Mro # Po [2] MRO DANDA..MRO DOUBLE DANDA - -# Total code points: 43 - -# ================================================ - -10A80..10A9C ; Old_North_Arabian # Lo [29] OLD NORTH ARABIAN LETTER HEH..OLD NORTH ARABIAN LETTER ZAH -10A9D..10A9F ; Old_North_Arabian # No [3] OLD NORTH ARABIAN NUMBER ONE..OLD NORTH ARABIAN NUMBER TWENTY - -# Total code points: 32 - -# ================================================ - -10880..1089E ; Nabataean # Lo [31] NABATAEAN LETTER FINAL ALEPH..NABATAEAN LETTER TAW -108A7..108AF ; Nabataean # No [9] NABATAEAN NUMBER ONE..NABATAEAN NUMBER ONE HUNDRED - -# Total code points: 40 - -# ================================================ - -10860..10876 ; Palmyrene # Lo [23] PALMYRENE LETTER ALEPH..PALMYRENE LETTER TAW -10877..10878 ; Palmyrene # So [2] PALMYRENE LEFT-POINTING FLEURON..PALMYRENE RIGHT-POINTING FLEURON -10879..1087F ; Palmyrene # No [7] PALMYRENE NUMBER ONE..PALMYRENE NUMBER TWENTY - -# Total code points: 32 - -# ================================================ - -11AC0..11AF8 ; Pau_Cin_Hau # Lo [57] PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL - -# Total code points: 57 - -# ================================================ - -10350..10375 ; Old_Permic # Lo [38] OLD PERMIC LETTER AN..OLD PERMIC LETTER IA -10376..1037A ; Old_Permic # Mn [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII - -# Total code points: 43 - -# ================================================ - -10B80..10B91 ; Psalter_Pahlavi # Lo [18] PSALTER PAHLAVI LETTER ALEPH..PSALTER PAHLAVI LETTER TAW -10B99..10B9C ; Psalter_Pahlavi # Po [4] PSALTER PAHLAVI SECTION MARK..PSALTER PAHLAVI FOUR DOTS WITH DOT -10BA9..10BAF ; Psalter_Pahlavi # No [7] PSALTER PAHLAVI NUMBER ONE..PSALTER PAHLAVI NUMBER ONE HUNDRED - -# Total code points: 29 - -# ================================================ - -11580..115AE ; Siddham # Lo [47] SIDDHAM LETTER A..SIDDHAM LETTER HA -115AF..115B1 ; Siddham # Mc [3] SIDDHAM VOWEL SIGN AA..SIDDHAM VOWEL SIGN II -115B2..115B5 ; Siddham # Mn [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR -115B8..115BB ; Siddham # Mc [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU -115BC..115BD ; Siddham # Mn [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA -115BE ; Siddham # Mc SIDDHAM SIGN VISARGA -115BF..115C0 ; Siddham # Mn [2] SIDDHAM SIGN VIRAMA..SIDDHAM SIGN NUKTA -115C1..115D7 ; Siddham # Po [23] SIDDHAM SIGN SIDDHAM..SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES -115D8..115DB ; Siddham # Lo [4] SIDDHAM LETTER THREE-CIRCLE ALTERNATE I..SIDDHAM LETTER ALTERNATE U -115DC..115DD ; Siddham # Mn [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU - -# Total code points: 92 - -# ================================================ - -112B0..112DE ; Khudawadi # Lo [47] KHUDAWADI LETTER A..KHUDAWADI LETTER HA -112DF ; Khudawadi # Mn KHUDAWADI SIGN ANUSVARA -112E0..112E2 ; Khudawadi # Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II -112E3..112EA ; Khudawadi # Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA -112F0..112F9 ; Khudawadi # Nd [10] KHUDAWADI DIGIT ZERO..KHUDAWADI DIGIT NINE - -# Total code points: 69 - -# ================================================ - -11480..114AF ; Tirhuta # Lo [48] TIRHUTA ANJI..TIRHUTA LETTER HA -114B0..114B2 ; Tirhuta # Mc [3] TIRHUTA VOWEL SIGN AA..TIRHUTA VOWEL SIGN II -114B3..114B8 ; Tirhuta # Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL -114B9 ; Tirhuta # Mc TIRHUTA VOWEL SIGN E -114BA ; Tirhuta # Mn TIRHUTA VOWEL SIGN SHORT E -114BB..114BE ; Tirhuta # Mc [4] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN AU -114BF..114C0 ; Tirhuta # Mn [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA -114C1 ; Tirhuta # Mc TIRHUTA SIGN VISARGA -114C2..114C3 ; Tirhuta # Mn [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA -114C4..114C5 ; Tirhuta # Lo [2] TIRHUTA SIGN AVAGRAHA..TIRHUTA GVANG -114C6 ; Tirhuta # Po TIRHUTA ABBREVIATION SIGN -114C7 ; Tirhuta # Lo TIRHUTA OM -114D0..114D9 ; Tirhuta # Nd [10] TIRHUTA DIGIT ZERO..TIRHUTA DIGIT NINE - -# Total code points: 82 - -# ================================================ - -118A0..118DF ; Warang_Citi # L& [64] WARANG CITI CAPITAL LETTER NGAA..WARANG CITI SMALL LETTER VIYO -118E0..118E9 ; Warang_Citi # Nd [10] WARANG CITI DIGIT ZERO..WARANG CITI DIGIT NINE -118EA..118F2 ; Warang_Citi # No [9] WARANG CITI NUMBER TEN..WARANG CITI NUMBER NINETY -118FF ; Warang_Citi # Lo WARANG CITI OM - -# Total code points: 84 - -# ================================================ - -11700..11719 ; Ahom # Lo [26] AHOM LETTER KA..AHOM LETTER JHA -1171D..1171F ; Ahom # Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA -11720..11721 ; Ahom # Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA -11722..11725 ; Ahom # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU -11726 ; Ahom # Mc AHOM VOWEL SIGN E -11727..1172B ; Ahom # Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER -11730..11739 ; Ahom # Nd [10] AHOM DIGIT ZERO..AHOM DIGIT NINE -1173A..1173B ; Ahom # No [2] AHOM NUMBER TEN..AHOM NUMBER TWENTY -1173C..1173E ; Ahom # Po [3] AHOM SIGN SMALL SECTION..AHOM SIGN RULAI -1173F ; Ahom # So AHOM SYMBOL VI - -# Total code points: 57 - -# ================================================ - -14400..14646 ; Anatolian_Hieroglyphs # Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530 - -# Total code points: 583 - -# ================================================ - -108E0..108F2 ; Hatran # Lo [19] HATRAN LETTER ALEPH..HATRAN LETTER QOPH -108F4..108F5 ; Hatran # Lo [2] HATRAN LETTER SHIN..HATRAN LETTER TAW -108FB..108FF ; Hatran # No [5] HATRAN NUMBER ONE..HATRAN NUMBER ONE HUNDRED - -# Total code points: 26 - -# ================================================ - -11280..11286 ; Multani # Lo [7] MULTANI LETTER A..MULTANI LETTER GA -11288 ; Multani # Lo MULTANI LETTER GHA -1128A..1128D ; Multani # Lo [4] MULTANI LETTER CA..MULTANI LETTER JJA -1128F..1129D ; Multani # Lo [15] MULTANI LETTER NYA..MULTANI LETTER BA -1129F..112A8 ; Multani # Lo [10] MULTANI LETTER BHA..MULTANI LETTER RHA -112A9 ; Multani # Po MULTANI SECTION MARK - -# Total code points: 38 - -# ================================================ - -10C80..10CB2 ; Old_Hungarian # L& [51] OLD HUNGARIAN CAPITAL LETTER A..OLD HUNGARIAN CAPITAL LETTER US -10CC0..10CF2 ; Old_Hungarian # L& [51] OLD HUNGARIAN SMALL LETTER A..OLD HUNGARIAN SMALL LETTER US -10CFA..10CFF ; Old_Hungarian # No [6] OLD HUNGARIAN NUMBER ONE..OLD HUNGARIAN NUMBER ONE THOUSAND - -# Total code points: 108 - -# ================================================ - -1D800..1D9FF ; SignWriting # So [512] SIGNWRITING HAND-FIST INDEX..SIGNWRITING HEAD -1DA00..1DA36 ; SignWriting # Mn [55] SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN -1DA37..1DA3A ; SignWriting # So [4] SIGNWRITING AIR BLOW SMALL ROTATIONS..SIGNWRITING BREATH EXHALE -1DA3B..1DA6C ; SignWriting # Mn [50] SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT -1DA6D..1DA74 ; SignWriting # So [8] SIGNWRITING SHOULDER HIP SPINE..SIGNWRITING TORSO-FLOORPLANE TWISTING -1DA75 ; SignWriting # Mn SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS -1DA76..1DA83 ; SignWriting # So [14] SIGNWRITING LIMB COMBINATION..SIGNWRITING LOCATION DEPTH -1DA84 ; SignWriting # Mn SIGNWRITING LOCATION HEAD NECK -1DA85..1DA86 ; SignWriting # So [2] SIGNWRITING LOCATION TORSO..SIGNWRITING LOCATION LIMBS DIGITS -1DA87..1DA8B ; SignWriting # Po [5] SIGNWRITING COMMA..SIGNWRITING PARENTHESIS -1DA9B..1DA9F ; SignWriting # Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 -1DAA1..1DAAF ; SignWriting # Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 - -# Total code points: 672 - -# ================================================ - -1E900..1E943 ; Adlam # L& [68] ADLAM CAPITAL LETTER ALIF..ADLAM SMALL LETTER SHA -1E944..1E94A ; Adlam # Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA -1E950..1E959 ; Adlam # Nd [10] ADLAM DIGIT ZERO..ADLAM DIGIT NINE -1E95E..1E95F ; Adlam # Po [2] ADLAM INITIAL EXCLAMATION MARK..ADLAM INITIAL QUESTION MARK - -# Total code points: 87 - -# ================================================ - -11C00..11C08 ; Bhaiksuki # Lo [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L -11C0A..11C2E ; Bhaiksuki # Lo [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA -11C2F ; Bhaiksuki # Mc BHAIKSUKI VOWEL SIGN AA -11C30..11C36 ; Bhaiksuki # Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L -11C38..11C3D ; Bhaiksuki # Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA -11C3E ; Bhaiksuki # Mc BHAIKSUKI SIGN VISARGA -11C3F ; Bhaiksuki # Mn BHAIKSUKI SIGN VIRAMA -11C40 ; Bhaiksuki # Lo BHAIKSUKI SIGN AVAGRAHA -11C41..11C45 ; Bhaiksuki # Po [5] BHAIKSUKI DANDA..BHAIKSUKI GAP FILLER-2 -11C50..11C59 ; Bhaiksuki # Nd [10] BHAIKSUKI DIGIT ZERO..BHAIKSUKI DIGIT NINE -11C5A..11C6C ; Bhaiksuki # No [19] BHAIKSUKI NUMBER ONE..BHAIKSUKI HUNDREDS UNIT MARK - -# Total code points: 97 - -# ================================================ - -11C70..11C71 ; Marchen # Po [2] MARCHEN HEAD MARK..MARCHEN MARK SHAD -11C72..11C8F ; Marchen # Lo [30] MARCHEN LETTER KA..MARCHEN LETTER A -11C92..11CA7 ; Marchen # Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA -11CA9 ; Marchen # Mc MARCHEN SUBJOINED LETTER YA -11CAA..11CB0 ; Marchen # Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA -11CB1 ; Marchen # Mc MARCHEN VOWEL SIGN I -11CB2..11CB3 ; Marchen # Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E -11CB4 ; Marchen # Mc MARCHEN VOWEL SIGN O -11CB5..11CB6 ; Marchen # Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU - -# Total code points: 68 - -# ================================================ - -11400..11434 ; Newa # Lo [53] NEWA LETTER A..NEWA LETTER HA -11435..11437 ; Newa # Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II -11438..1143F ; Newa # Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI -11440..11441 ; Newa # Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU -11442..11444 ; Newa # Mn [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA -11445 ; Newa # Mc NEWA SIGN VISARGA -11446 ; Newa # Mn NEWA SIGN NUKTA -11447..1144A ; Newa # Lo [4] NEWA SIGN AVAGRAHA..NEWA SIDDHI -1144B..1144F ; Newa # Po [5] NEWA DANDA..NEWA ABBREVIATION SIGN -11450..11459 ; Newa # Nd [10] NEWA DIGIT ZERO..NEWA DIGIT NINE -1145B ; Newa # Po NEWA PLACEHOLDER MARK -1145D ; Newa # Po NEWA INSERTION SIGN - -# Total code points: 92 - -# ================================================ - -104B0..104D3 ; Osage # L& [36] OSAGE CAPITAL LETTER A..OSAGE CAPITAL LETTER ZHA -104D8..104FB ; Osage # L& [36] OSAGE SMALL LETTER A..OSAGE SMALL LETTER ZHA - -# Total code points: 72 - -# ================================================ - -16FE0 ; Tangut # Lm TANGUT ITERATION MARK -17000..187EC ; Tangut # Lo [6125] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187EC -18800..18AF2 ; Tangut # Lo [755] TANGUT COMPONENT-001..TANGUT COMPONENT-755 - -# Total code points: 6881 - -# ================================================ - -11D00..11D06 ; Masaram_Gondi # Lo [7] MASARAM GONDI LETTER A..MASARAM GONDI LETTER E -11D08..11D09 ; Masaram_Gondi # Lo [2] MASARAM GONDI LETTER AI..MASARAM GONDI LETTER O -11D0B..11D30 ; Masaram_Gondi # Lo [38] MASARAM GONDI LETTER AU..MASARAM GONDI LETTER TRA -11D31..11D36 ; Masaram_Gondi # Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R -11D3A ; Masaram_Gondi # Mn MASARAM GONDI VOWEL SIGN E -11D3C..11D3D ; Masaram_Gondi # Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O -11D3F..11D45 ; Masaram_Gondi # Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA -11D46 ; Masaram_Gondi # Lo MASARAM GONDI REPHA -11D47 ; Masaram_Gondi # Mn MASARAM GONDI RA-KARA -11D50..11D59 ; Masaram_Gondi # Nd [10] MASARAM GONDI DIGIT ZERO..MASARAM GONDI DIGIT NINE - -# Total code points: 75 - -# ================================================ - -16FE1 ; Nushu # Lm NUSHU ITERATION MARK -1B170..1B2FB ; Nushu # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB - -# Total code points: 397 - -# ================================================ - -11A50 ; Soyombo # Lo SOYOMBO LETTER A -11A51..11A56 ; Soyombo # Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE -11A57..11A58 ; Soyombo # Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU -11A59..11A5B ; Soyombo # Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK -11A5C..11A83 ; Soyombo # Lo [40] SOYOMBO LETTER KA..SOYOMBO LETTER KSSA -11A86..11A89 ; Soyombo # Lo [4] SOYOMBO CLUSTER-INITIAL LETTER RA..SOYOMBO CLUSTER-INITIAL LETTER SA -11A8A..11A96 ; Soyombo # Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA -11A97 ; Soyombo # Mc SOYOMBO SIGN VISARGA -11A98..11A99 ; Soyombo # Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER -11A9A..11A9C ; Soyombo # Po [3] SOYOMBO MARK TSHEG..SOYOMBO MARK DOUBLE SHAD -11A9E..11AA2 ; Soyombo # Po [5] SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME..SOYOMBO TERMINAL MARK-2 - -# Total code points: 80 - -# ================================================ - -11A00 ; Zanabazar_Square # Lo ZANABAZAR SQUARE LETTER A -11A01..11A06 ; Zanabazar_Square # Mn [6] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL SIGN O -11A07..11A08 ; Zanabazar_Square # Mc [2] ZANABAZAR SQUARE VOWEL SIGN AI..ZANABAZAR SQUARE VOWEL SIGN AU -11A09..11A0A ; Zanabazar_Square # Mn [2] ZANABAZAR SQUARE VOWEL SIGN REVERSED I..ZANABAZAR SQUARE VOWEL LENGTH MARK -11A0B..11A32 ; Zanabazar_Square # Lo [40] ZANABAZAR SQUARE LETTER KA..ZANABAZAR SQUARE LETTER KSSA -11A33..11A38 ; Zanabazar_Square # Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA -11A39 ; Zanabazar_Square # Mc ZANABAZAR SQUARE SIGN VISARGA -11A3A ; Zanabazar_Square # Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA -11A3B..11A3E ; Zanabazar_Square # Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA -11A3F..11A46 ; Zanabazar_Square # Po [8] ZANABAZAR SQUARE INITIAL HEAD MARK..ZANABAZAR SQUARE CLOSING DOUBLE-LINED HEAD MARK -11A47 ; Zanabazar_Square # Mn ZANABAZAR SQUARE SUBJOINER - -# Total code points: 72 - -# EOF +# Scripts-15.1.0.txt +# Date: 2023-07-28, 16:01:07 GMT +# © 2023 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see https://www.unicode.org/terms_of_use.html +# +# Unicode Character Database +# For documentation, see https://www.unicode.org/reports/tr44/ +# For more information, see: +# UAX #24, Unicode Script Property: https://www.unicode.org/reports/tr24/ +# Especially the sections: +# https://www.unicode.org/reports/tr24/#Assignment_Script_Values +# https://www.unicode.org/reports/tr24/#Assignment_ScriptX_Values +# + +# ================================================ + +# Property: Script + +# All code points not explicitly listed for Script +# have the value Unknown (Zzzz). + +# @missing: 0000..10FFFF; Unknown + +# ================================================ + +0000..001F ; Common # Cc [32] .. +0020 ; Common # Zs SPACE +0021..0023 ; Common # Po [3] EXCLAMATION MARK..NUMBER SIGN +0024 ; Common # Sc DOLLAR SIGN +0025..0027 ; Common # Po [3] PERCENT SIGN..APOSTROPHE +0028 ; Common # Ps LEFT PARENTHESIS +0029 ; Common # Pe RIGHT PARENTHESIS +002A ; Common # Po ASTERISK +002B ; Common # Sm PLUS SIGN +002C ; Common # Po COMMA +002D ; Common # Pd HYPHEN-MINUS +002E..002F ; Common # Po [2] FULL STOP..SOLIDUS +0030..0039 ; Common # Nd [10] DIGIT ZERO..DIGIT NINE +003A..003B ; Common # Po [2] COLON..SEMICOLON +003C..003E ; Common # Sm [3] LESS-THAN SIGN..GREATER-THAN SIGN +003F..0040 ; Common # Po [2] QUESTION MARK..COMMERCIAL AT +005B ; Common # Ps LEFT SQUARE BRACKET +005C ; Common # Po REVERSE SOLIDUS +005D ; Common # Pe RIGHT SQUARE BRACKET +005E ; Common # Sk CIRCUMFLEX ACCENT +005F ; Common # Pc LOW LINE +0060 ; Common # Sk GRAVE ACCENT +007B ; Common # Ps LEFT CURLY BRACKET +007C ; Common # Sm VERTICAL LINE +007D ; Common # Pe RIGHT CURLY BRACKET +007E ; Common # Sm TILDE +007F..009F ; Common # Cc [33] .. +00A0 ; Common # Zs NO-BREAK SPACE +00A1 ; Common # Po INVERTED EXCLAMATION MARK +00A2..00A5 ; Common # Sc [4] CENT SIGN..YEN SIGN +00A6 ; Common # So BROKEN BAR +00A7 ; Common # Po SECTION SIGN +00A8 ; Common # Sk DIAERESIS +00A9 ; Common # So COPYRIGHT SIGN +00AB ; Common # Pi LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +00AC ; Common # Sm NOT SIGN +00AD ; Common # Cf SOFT HYPHEN +00AE ; Common # So REGISTERED SIGN +00AF ; Common # Sk MACRON +00B0 ; Common # So DEGREE SIGN +00B1 ; Common # Sm PLUS-MINUS SIGN +00B2..00B3 ; Common # No [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE +00B4 ; Common # Sk ACUTE ACCENT +00B5 ; Common # L& MICRO SIGN +00B6..00B7 ; Common # Po [2] PILCROW SIGN..MIDDLE DOT +00B8 ; Common # Sk CEDILLA +00B9 ; Common # No SUPERSCRIPT ONE +00BB ; Common # Pf RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +00BC..00BE ; Common # No [3] VULGAR FRACTION ONE QUARTER..VULGAR FRACTION THREE QUARTERS +00BF ; Common # Po INVERTED QUESTION MARK +00D7 ; Common # Sm MULTIPLICATION SIGN +00F7 ; Common # Sm DIVISION SIGN +02B9..02C1 ; Common # Lm [9] MODIFIER LETTER PRIME..MODIFIER LETTER REVERSED GLOTTAL STOP +02C2..02C5 ; Common # Sk [4] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD +02C6..02D1 ; Common # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON +02D2..02DF ; Common # Sk [14] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER CROSS ACCENT +02E5..02E9 ; Common # Sk [5] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER EXTRA-LOW TONE BAR +02EC ; Common # Lm MODIFIER LETTER VOICING +02ED ; Common # Sk MODIFIER LETTER UNASPIRATED +02EE ; Common # Lm MODIFIER LETTER DOUBLE APOSTROPHE +02EF..02FF ; Common # Sk [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW +0374 ; Common # Lm GREEK NUMERAL SIGN +037E ; Common # Po GREEK QUESTION MARK +0385 ; Common # Sk GREEK DIALYTIKA TONOS +0387 ; Common # Po GREEK ANO TELEIA +0605 ; Common # Cf ARABIC NUMBER MARK ABOVE +060C ; Common # Po ARABIC COMMA +061B ; Common # Po ARABIC SEMICOLON +061F ; Common # Po ARABIC QUESTION MARK +0640 ; Common # Lm ARABIC TATWEEL +06DD ; Common # Cf ARABIC END OF AYAH +08E2 ; Common # Cf ARABIC DISPUTED END OF AYAH +0964..0965 ; Common # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA +0E3F ; Common # Sc THAI CURRENCY SYMBOL BAHT +0FD5..0FD8 ; Common # So [4] RIGHT-FACING SVASTI SIGN..LEFT-FACING SVASTI SIGN WITH DOTS +10FB ; Common # Po GEORGIAN PARAGRAPH SEPARATOR +16EB..16ED ; Common # Po [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION +1735..1736 ; Common # Po [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION +1802..1803 ; Common # Po [2] MONGOLIAN COMMA..MONGOLIAN FULL STOP +1805 ; Common # Po MONGOLIAN FOUR DOTS +1CD3 ; Common # Po VEDIC SIGN NIHSHVASA +1CE1 ; Common # Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA +1CE9..1CEC ; Common # Lo [4] VEDIC SIGN ANUSVARA ANTARGOMUKHA..VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL +1CEE..1CF3 ; Common # Lo [6] VEDIC SIGN HEXIFORM LONG ANUSVARA..VEDIC SIGN ROTATED ARDHAVISARGA +1CF5..1CF6 ; Common # Lo [2] VEDIC SIGN JIHVAMULIYA..VEDIC SIGN UPADHMANIYA +1CF7 ; Common # Mc VEDIC SIGN ATIKRAMA +1CFA ; Common # Lo VEDIC SIGN DOUBLE ANUSVARA ANTARGOMUKHA +2000..200A ; Common # Zs [11] EN QUAD..HAIR SPACE +200B ; Common # Cf ZERO WIDTH SPACE +200E..200F ; Common # Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK +2010..2015 ; Common # Pd [6] HYPHEN..HORIZONTAL BAR +2016..2017 ; Common # Po [2] DOUBLE VERTICAL LINE..DOUBLE LOW LINE +2018 ; Common # Pi LEFT SINGLE QUOTATION MARK +2019 ; Common # Pf RIGHT SINGLE QUOTATION MARK +201A ; Common # Ps SINGLE LOW-9 QUOTATION MARK +201B..201C ; Common # Pi [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK +201D ; Common # Pf RIGHT DOUBLE QUOTATION MARK +201E ; Common # Ps DOUBLE LOW-9 QUOTATION MARK +201F ; Common # Pi DOUBLE HIGH-REVERSED-9 QUOTATION MARK +2020..2027 ; Common # Po [8] DAGGER..HYPHENATION POINT +2028 ; Common # Zl LINE SEPARATOR +2029 ; Common # Zp PARAGRAPH SEPARATOR +202A..202E ; Common # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE +202F ; Common # Zs NARROW NO-BREAK SPACE +2030..2038 ; Common # Po [9] PER MILLE SIGN..CARET +2039 ; Common # Pi SINGLE LEFT-POINTING ANGLE QUOTATION MARK +203A ; Common # Pf SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +203B..203E ; Common # Po [4] REFERENCE MARK..OVERLINE +203F..2040 ; Common # Pc [2] UNDERTIE..CHARACTER TIE +2041..2043 ; Common # Po [3] CARET INSERTION POINT..HYPHEN BULLET +2044 ; Common # Sm FRACTION SLASH +2045 ; Common # Ps LEFT SQUARE BRACKET WITH QUILL +2046 ; Common # Pe RIGHT SQUARE BRACKET WITH QUILL +2047..2051 ; Common # Po [11] DOUBLE QUESTION MARK..TWO ASTERISKS ALIGNED VERTICALLY +2052 ; Common # Sm COMMERCIAL MINUS SIGN +2053 ; Common # Po SWUNG DASH +2054 ; Common # Pc INVERTED UNDERTIE +2055..205E ; Common # Po [10] FLOWER PUNCTUATION MARK..VERTICAL FOUR DOTS +205F ; Common # Zs MEDIUM MATHEMATICAL SPACE +2060..2064 ; Common # Cf [5] WORD JOINER..INVISIBLE PLUS +2066..206F ; Common # Cf [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES +2070 ; Common # No SUPERSCRIPT ZERO +2074..2079 ; Common # No [6] SUPERSCRIPT FOUR..SUPERSCRIPT NINE +207A..207C ; Common # Sm [3] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT EQUALS SIGN +207D ; Common # Ps SUPERSCRIPT LEFT PARENTHESIS +207E ; Common # Pe SUPERSCRIPT RIGHT PARENTHESIS +2080..2089 ; Common # No [10] SUBSCRIPT ZERO..SUBSCRIPT NINE +208A..208C ; Common # Sm [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN +208D ; Common # Ps SUBSCRIPT LEFT PARENTHESIS +208E ; Common # Pe SUBSCRIPT RIGHT PARENTHESIS +20A0..20C0 ; Common # Sc [33] EURO-CURRENCY SIGN..SOM SIGN +2100..2101 ; Common # So [2] ACCOUNT OF..ADDRESSED TO THE SUBJECT +2102 ; Common # L& DOUBLE-STRUCK CAPITAL C +2103..2106 ; Common # So [4] DEGREE CELSIUS..CADA UNA +2107 ; Common # L& EULER CONSTANT +2108..2109 ; Common # So [2] SCRUPLE..DEGREE FAHRENHEIT +210A..2113 ; Common # L& [10] SCRIPT SMALL G..SCRIPT SMALL L +2114 ; Common # So L B BAR SYMBOL +2115 ; Common # L& DOUBLE-STRUCK CAPITAL N +2116..2117 ; Common # So [2] NUMERO SIGN..SOUND RECORDING COPYRIGHT +2118 ; Common # Sm SCRIPT CAPITAL P +2119..211D ; Common # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R +211E..2123 ; Common # So [6] PRESCRIPTION TAKE..VERSICLE +2124 ; Common # L& DOUBLE-STRUCK CAPITAL Z +2125 ; Common # So OUNCE SIGN +2127 ; Common # So INVERTED OHM SIGN +2128 ; Common # L& BLACK-LETTER CAPITAL Z +2129 ; Common # So TURNED GREEK SMALL LETTER IOTA +212C..212D ; Common # L& [2] SCRIPT CAPITAL B..BLACK-LETTER CAPITAL C +212E ; Common # So ESTIMATED SYMBOL +212F..2131 ; Common # L& [3] SCRIPT SMALL E..SCRIPT CAPITAL F +2133..2134 ; Common # L& [2] SCRIPT CAPITAL M..SCRIPT SMALL O +2135..2138 ; Common # Lo [4] ALEF SYMBOL..DALET SYMBOL +2139 ; Common # L& INFORMATION SOURCE +213A..213B ; Common # So [2] ROTATED CAPITAL Q..FACSIMILE SIGN +213C..213F ; Common # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI +2140..2144 ; Common # Sm [5] DOUBLE-STRUCK N-ARY SUMMATION..TURNED SANS-SERIF CAPITAL Y +2145..2149 ; Common # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J +214A ; Common # So PROPERTY LINE +214B ; Common # Sm TURNED AMPERSAND +214C..214D ; Common # So [2] PER SIGN..AKTIESELSKAB +214F ; Common # So SYMBOL FOR SAMARITAN SOURCE +2150..215F ; Common # No [16] VULGAR FRACTION ONE SEVENTH..FRACTION NUMERATOR ONE +2189 ; Common # No VULGAR FRACTION ZERO THIRDS +218A..218B ; Common # So [2] TURNED DIGIT TWO..TURNED DIGIT THREE +2190..2194 ; Common # Sm [5] LEFTWARDS ARROW..LEFT RIGHT ARROW +2195..2199 ; Common # So [5] UP DOWN ARROW..SOUTH WEST ARROW +219A..219B ; Common # Sm [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE +219C..219F ; Common # So [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW +21A0 ; Common # Sm RIGHTWARDS TWO HEADED ARROW +21A1..21A2 ; Common # So [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL +21A3 ; Common # Sm RIGHTWARDS ARROW WITH TAIL +21A4..21A5 ; Common # So [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR +21A6 ; Common # Sm RIGHTWARDS ARROW FROM BAR +21A7..21AD ; Common # So [7] DOWNWARDS ARROW FROM BAR..LEFT RIGHT WAVE ARROW +21AE ; Common # Sm LEFT RIGHT ARROW WITH STROKE +21AF..21CD ; Common # So [31] DOWNWARDS ZIGZAG ARROW..LEFTWARDS DOUBLE ARROW WITH STROKE +21CE..21CF ; Common # Sm [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE +21D0..21D1 ; Common # So [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW +21D2 ; Common # Sm RIGHTWARDS DOUBLE ARROW +21D3 ; Common # So DOWNWARDS DOUBLE ARROW +21D4 ; Common # Sm LEFT RIGHT DOUBLE ARROW +21D5..21F3 ; Common # So [31] UP DOWN DOUBLE ARROW..UP DOWN WHITE ARROW +21F4..22FF ; Common # Sm [268] RIGHT ARROW WITH SMALL CIRCLE..Z NOTATION BAG MEMBERSHIP +2300..2307 ; Common # So [8] DIAMETER SIGN..WAVY LINE +2308 ; Common # Ps LEFT CEILING +2309 ; Common # Pe RIGHT CEILING +230A ; Common # Ps LEFT FLOOR +230B ; Common # Pe RIGHT FLOOR +230C..231F ; Common # So [20] BOTTOM RIGHT CROP..BOTTOM RIGHT CORNER +2320..2321 ; Common # Sm [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL +2322..2328 ; Common # So [7] FROWN..KEYBOARD +2329 ; Common # Ps LEFT-POINTING ANGLE BRACKET +232A ; Common # Pe RIGHT-POINTING ANGLE BRACKET +232B..237B ; Common # So [81] ERASE TO THE LEFT..NOT CHECK MARK +237C ; Common # Sm RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW +237D..239A ; Common # So [30] SHOULDERED OPEN BOX..CLEAR SCREEN SYMBOL +239B..23B3 ; Common # Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM +23B4..23DB ; Common # So [40] TOP SQUARE BRACKET..FUSE +23DC..23E1 ; Common # Sm [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET +23E2..2426 ; Common # So [69] WHITE TRAPEZIUM..SYMBOL FOR SUBSTITUTE FORM TWO +2440..244A ; Common # So [11] OCR HOOK..OCR DOUBLE BACKSLASH +2460..249B ; Common # No [60] CIRCLED DIGIT ONE..NUMBER TWENTY FULL STOP +249C..24E9 ; Common # So [78] PARENTHESIZED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z +24EA..24FF ; Common # No [22] CIRCLED DIGIT ZERO..NEGATIVE CIRCLED DIGIT ZERO +2500..25B6 ; Common # So [183] BOX DRAWINGS LIGHT HORIZONTAL..BLACK RIGHT-POINTING TRIANGLE +25B7 ; Common # Sm WHITE RIGHT-POINTING TRIANGLE +25B8..25C0 ; Common # So [9] BLACK RIGHT-POINTING SMALL TRIANGLE..BLACK LEFT-POINTING TRIANGLE +25C1 ; Common # Sm WHITE LEFT-POINTING TRIANGLE +25C2..25F7 ; Common # So [54] BLACK LEFT-POINTING SMALL TRIANGLE..WHITE CIRCLE WITH UPPER RIGHT QUADRANT +25F8..25FF ; Common # Sm [8] UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE +2600..266E ; Common # So [111] BLACK SUN WITH RAYS..MUSIC NATURAL SIGN +266F ; Common # Sm MUSIC SHARP SIGN +2670..2767 ; Common # So [248] WEST SYRIAC CROSS..ROTATED FLORAL HEART BULLET +2768 ; Common # Ps MEDIUM LEFT PARENTHESIS ORNAMENT +2769 ; Common # Pe MEDIUM RIGHT PARENTHESIS ORNAMENT +276A ; Common # Ps MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT +276B ; Common # Pe MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT +276C ; Common # Ps MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT +276D ; Common # Pe MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT +276E ; Common # Ps HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT +276F ; Common # Pe HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT +2770 ; Common # Ps HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT +2771 ; Common # Pe HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT +2772 ; Common # Ps LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT +2773 ; Common # Pe LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT +2774 ; Common # Ps MEDIUM LEFT CURLY BRACKET ORNAMENT +2775 ; Common # Pe MEDIUM RIGHT CURLY BRACKET ORNAMENT +2776..2793 ; Common # No [30] DINGBAT NEGATIVE CIRCLED DIGIT ONE..DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN +2794..27BF ; Common # So [44] HEAVY WIDE-HEADED RIGHTWARDS ARROW..DOUBLE CURLY LOOP +27C0..27C4 ; Common # Sm [5] THREE DIMENSIONAL ANGLE..OPEN SUPERSET +27C5 ; Common # Ps LEFT S-SHAPED BAG DELIMITER +27C6 ; Common # Pe RIGHT S-SHAPED BAG DELIMITER +27C7..27E5 ; Common # Sm [31] OR WITH DOT INSIDE..WHITE SQUARE WITH RIGHTWARDS TICK +27E6 ; Common # Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET +27E7 ; Common # Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET +27E8 ; Common # Ps MATHEMATICAL LEFT ANGLE BRACKET +27E9 ; Common # Pe MATHEMATICAL RIGHT ANGLE BRACKET +27EA ; Common # Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET +27EB ; Common # Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET +27EC ; Common # Ps MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET +27ED ; Common # Pe MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET +27EE ; Common # Ps MATHEMATICAL LEFT FLATTENED PARENTHESIS +27EF ; Common # Pe MATHEMATICAL RIGHT FLATTENED PARENTHESIS +27F0..27FF ; Common # Sm [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW +2900..2982 ; Common # Sm [131] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..Z NOTATION TYPE COLON +2983 ; Common # Ps LEFT WHITE CURLY BRACKET +2984 ; Common # Pe RIGHT WHITE CURLY BRACKET +2985 ; Common # Ps LEFT WHITE PARENTHESIS +2986 ; Common # Pe RIGHT WHITE PARENTHESIS +2987 ; Common # Ps Z NOTATION LEFT IMAGE BRACKET +2988 ; Common # Pe Z NOTATION RIGHT IMAGE BRACKET +2989 ; Common # Ps Z NOTATION LEFT BINDING BRACKET +298A ; Common # Pe Z NOTATION RIGHT BINDING BRACKET +298B ; Common # Ps LEFT SQUARE BRACKET WITH UNDERBAR +298C ; Common # Pe RIGHT SQUARE BRACKET WITH UNDERBAR +298D ; Common # Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER +298E ; Common # Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +298F ; Common # Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +2990 ; Common # Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER +2991 ; Common # Ps LEFT ANGLE BRACKET WITH DOT +2992 ; Common # Pe RIGHT ANGLE BRACKET WITH DOT +2993 ; Common # Ps LEFT ARC LESS-THAN BRACKET +2994 ; Common # Pe RIGHT ARC GREATER-THAN BRACKET +2995 ; Common # Ps DOUBLE LEFT ARC GREATER-THAN BRACKET +2996 ; Common # Pe DOUBLE RIGHT ARC LESS-THAN BRACKET +2997 ; Common # Ps LEFT BLACK TORTOISE SHELL BRACKET +2998 ; Common # Pe RIGHT BLACK TORTOISE SHELL BRACKET +2999..29D7 ; Common # Sm [63] DOTTED FENCE..BLACK HOURGLASS +29D8 ; Common # Ps LEFT WIGGLY FENCE +29D9 ; Common # Pe RIGHT WIGGLY FENCE +29DA ; Common # Ps LEFT DOUBLE WIGGLY FENCE +29DB ; Common # Pe RIGHT DOUBLE WIGGLY FENCE +29DC..29FB ; Common # Sm [32] INCOMPLETE INFINITY..TRIPLE PLUS +29FC ; Common # Ps LEFT-POINTING CURVED ANGLE BRACKET +29FD ; Common # Pe RIGHT-POINTING CURVED ANGLE BRACKET +29FE..2AFF ; Common # Sm [258] TINY..N-ARY WHITE VERTICAL BAR +2B00..2B2F ; Common # So [48] NORTH EAST WHITE ARROW..WHITE VERTICAL ELLIPSE +2B30..2B44 ; Common # Sm [21] LEFT ARROW WITH SMALL CIRCLE..RIGHTWARDS ARROW THROUGH SUPERSET +2B45..2B46 ; Common # So [2] LEFTWARDS QUADRUPLE ARROW..RIGHTWARDS QUADRUPLE ARROW +2B47..2B4C ; Common # Sm [6] REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW..RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR +2B4D..2B73 ; Common # So [39] DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW..DOWNWARDS TRIANGLE-HEADED ARROW TO BAR +2B76..2B95 ; Common # So [32] NORTH WEST TRIANGLE-HEADED ARROW TO BAR..RIGHTWARDS BLACK ARROW +2B97..2BFF ; Common # So [105] SYMBOL FOR TYPE A ELECTRONICS..HELLSCHREIBER PAUSE SYMBOL +2E00..2E01 ; Common # Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER +2E02 ; Common # Pi LEFT SUBSTITUTION BRACKET +2E03 ; Common # Pf RIGHT SUBSTITUTION BRACKET +2E04 ; Common # Pi LEFT DOTTED SUBSTITUTION BRACKET +2E05 ; Common # Pf RIGHT DOTTED SUBSTITUTION BRACKET +2E06..2E08 ; Common # Po [3] RAISED INTERPOLATION MARKER..DOTTED TRANSPOSITION MARKER +2E09 ; Common # Pi LEFT TRANSPOSITION BRACKET +2E0A ; Common # Pf RIGHT TRANSPOSITION BRACKET +2E0B ; Common # Po RAISED SQUARE +2E0C ; Common # Pi LEFT RAISED OMISSION BRACKET +2E0D ; Common # Pf RIGHT RAISED OMISSION BRACKET +2E0E..2E16 ; Common # Po [9] EDITORIAL CORONIS..DOTTED RIGHT-POINTING ANGLE +2E17 ; Common # Pd DOUBLE OBLIQUE HYPHEN +2E18..2E19 ; Common # Po [2] INVERTED INTERROBANG..PALM BRANCH +2E1A ; Common # Pd HYPHEN WITH DIAERESIS +2E1B ; Common # Po TILDE WITH RING ABOVE +2E1C ; Common # Pi LEFT LOW PARAPHRASE BRACKET +2E1D ; Common # Pf RIGHT LOW PARAPHRASE BRACKET +2E1E..2E1F ; Common # Po [2] TILDE WITH DOT ABOVE..TILDE WITH DOT BELOW +2E20 ; Common # Pi LEFT VERTICAL BAR WITH QUILL +2E21 ; Common # Pf RIGHT VERTICAL BAR WITH QUILL +2E22 ; Common # Ps TOP LEFT HALF BRACKET +2E23 ; Common # Pe TOP RIGHT HALF BRACKET +2E24 ; Common # Ps BOTTOM LEFT HALF BRACKET +2E25 ; Common # Pe BOTTOM RIGHT HALF BRACKET +2E26 ; Common # Ps LEFT SIDEWAYS U BRACKET +2E27 ; Common # Pe RIGHT SIDEWAYS U BRACKET +2E28 ; Common # Ps LEFT DOUBLE PARENTHESIS +2E29 ; Common # Pe RIGHT DOUBLE PARENTHESIS +2E2A..2E2E ; Common # Po [5] TWO DOTS OVER ONE DOT PUNCTUATION..REVERSED QUESTION MARK +2E2F ; Common # Lm VERTICAL TILDE +2E30..2E39 ; Common # Po [10] RING POINT..TOP HALF SECTION SIGN +2E3A..2E3B ; Common # Pd [2] TWO-EM DASH..THREE-EM DASH +2E3C..2E3F ; Common # Po [4] STENOGRAPHIC FULL STOP..CAPITULUM +2E40 ; Common # Pd DOUBLE HYPHEN +2E41 ; Common # Po REVERSED COMMA +2E42 ; Common # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK +2E43..2E4F ; Common # Po [13] DASH WITH LEFT UPTURN..CORNISH VERSE DIVIDER +2E50..2E51 ; Common # So [2] CROSS PATTY WITH RIGHT CROSSBAR..CROSS PATTY WITH LEFT CROSSBAR +2E52..2E54 ; Common # Po [3] TIRONIAN SIGN CAPITAL ET..MEDIEVAL QUESTION MARK +2E55 ; Common # Ps LEFT SQUARE BRACKET WITH STROKE +2E56 ; Common # Pe RIGHT SQUARE BRACKET WITH STROKE +2E57 ; Common # Ps LEFT SQUARE BRACKET WITH DOUBLE STROKE +2E58 ; Common # Pe RIGHT SQUARE BRACKET WITH DOUBLE STROKE +2E59 ; Common # Ps TOP HALF LEFT PARENTHESIS +2E5A ; Common # Pe TOP HALF RIGHT PARENTHESIS +2E5B ; Common # Ps BOTTOM HALF LEFT PARENTHESIS +2E5C ; Common # Pe BOTTOM HALF RIGHT PARENTHESIS +2E5D ; Common # Pd OBLIQUE HYPHEN +2FF0..2FFF ; Common # So [16] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER ROTATION +3000 ; Common # Zs IDEOGRAPHIC SPACE +3001..3003 ; Common # Po [3] IDEOGRAPHIC COMMA..DITTO MARK +3004 ; Common # So JAPANESE INDUSTRIAL STANDARD SYMBOL +3006 ; Common # Lo IDEOGRAPHIC CLOSING MARK +3008 ; Common # Ps LEFT ANGLE BRACKET +3009 ; Common # Pe RIGHT ANGLE BRACKET +300A ; Common # Ps LEFT DOUBLE ANGLE BRACKET +300B ; Common # Pe RIGHT DOUBLE ANGLE BRACKET +300C ; Common # Ps LEFT CORNER BRACKET +300D ; Common # Pe RIGHT CORNER BRACKET +300E ; Common # Ps LEFT WHITE CORNER BRACKET +300F ; Common # Pe RIGHT WHITE CORNER BRACKET +3010 ; Common # Ps LEFT BLACK LENTICULAR BRACKET +3011 ; Common # Pe RIGHT BLACK LENTICULAR BRACKET +3012..3013 ; Common # So [2] POSTAL MARK..GETA MARK +3014 ; Common # Ps LEFT TORTOISE SHELL BRACKET +3015 ; Common # Pe RIGHT TORTOISE SHELL BRACKET +3016 ; Common # Ps LEFT WHITE LENTICULAR BRACKET +3017 ; Common # Pe RIGHT WHITE LENTICULAR BRACKET +3018 ; Common # Ps LEFT WHITE TORTOISE SHELL BRACKET +3019 ; Common # Pe RIGHT WHITE TORTOISE SHELL BRACKET +301A ; Common # Ps LEFT WHITE SQUARE BRACKET +301B ; Common # Pe RIGHT WHITE SQUARE BRACKET +301C ; Common # Pd WAVE DASH +301D ; Common # Ps REVERSED DOUBLE PRIME QUOTATION MARK +301E..301F ; Common # Pe [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK +3020 ; Common # So POSTAL MARK FACE +3030 ; Common # Pd WAVY DASH +3031..3035 ; Common # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF +3036..3037 ; Common # So [2] CIRCLED POSTAL MARK..IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL +303C ; Common # Lo MASU MARK +303D ; Common # Po PART ALTERNATION MARK +303E..303F ; Common # So [2] IDEOGRAPHIC VARIATION INDICATOR..IDEOGRAPHIC HALF FILL SPACE +309B..309C ; Common # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +30A0 ; Common # Pd KATAKANA-HIRAGANA DOUBLE HYPHEN +30FB ; Common # Po KATAKANA MIDDLE DOT +30FC ; Common # Lm KATAKANA-HIRAGANA PROLONGED SOUND MARK +3190..3191 ; Common # So [2] IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION REVERSE MARK +3192..3195 ; Common # No [4] IDEOGRAPHIC ANNOTATION ONE MARK..IDEOGRAPHIC ANNOTATION FOUR MARK +3196..319F ; Common # So [10] IDEOGRAPHIC ANNOTATION TOP MARK..IDEOGRAPHIC ANNOTATION MAN MARK +31C0..31E3 ; Common # So [36] CJK STROKE T..CJK STROKE Q +31EF ; Common # So IDEOGRAPHIC DESCRIPTION CHARACTER SUBTRACTION +3220..3229 ; Common # No [10] PARENTHESIZED IDEOGRAPH ONE..PARENTHESIZED IDEOGRAPH TEN +322A..3247 ; Common # So [30] PARENTHESIZED IDEOGRAPH MOON..CIRCLED IDEOGRAPH KOTO +3248..324F ; Common # No [8] CIRCLED NUMBER TEN ON BLACK SQUARE..CIRCLED NUMBER EIGHTY ON BLACK SQUARE +3250 ; Common # So PARTNERSHIP SIGN +3251..325F ; Common # No [15] CIRCLED NUMBER TWENTY ONE..CIRCLED NUMBER THIRTY FIVE +327F ; Common # So KOREAN STANDARD SYMBOL +3280..3289 ; Common # No [10] CIRCLED IDEOGRAPH ONE..CIRCLED IDEOGRAPH TEN +328A..32B0 ; Common # So [39] CIRCLED IDEOGRAPH MOON..CIRCLED IDEOGRAPH NIGHT +32B1..32BF ; Common # No [15] CIRCLED NUMBER THIRTY SIX..CIRCLED NUMBER FIFTY +32C0..32CF ; Common # So [16] IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY..LIMITED LIABILITY SIGN +32FF ; Common # So SQUARE ERA NAME REIWA +3358..33FF ; Common # So [168] IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO..SQUARE GAL +4DC0..4DFF ; Common # So [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION +A700..A716 ; Common # Sk [23] MODIFIER LETTER CHINESE TONE YIN PING..MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR +A717..A71F ; Common # Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK +A720..A721 ; Common # Sk [2] MODIFIER LETTER STRESS AND HIGH TONE..MODIFIER LETTER STRESS AND LOW TONE +A788 ; Common # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT +A789..A78A ; Common # Sk [2] MODIFIER LETTER COLON..MODIFIER LETTER SHORT EQUALS SIGN +A830..A835 ; Common # No [6] NORTH INDIC FRACTION ONE QUARTER..NORTH INDIC FRACTION THREE SIXTEENTHS +A836..A837 ; Common # So [2] NORTH INDIC QUARTER MARK..NORTH INDIC PLACEHOLDER MARK +A838 ; Common # Sc NORTH INDIC RUPEE MARK +A839 ; Common # So NORTH INDIC QUANTITY MARK +A92E ; Common # Po KAYAH LI SIGN CWI +A9CF ; Common # Lm JAVANESE PANGRANGKEP +AB5B ; Common # Sk MODIFIER BREVE WITH INVERTED BREVE +AB6A..AB6B ; Common # Sk [2] MODIFIER LETTER LEFT TACK..MODIFIER LETTER RIGHT TACK +FD3E ; Common # Pe ORNATE LEFT PARENTHESIS +FD3F ; Common # Ps ORNATE RIGHT PARENTHESIS +FE10..FE16 ; Common # Po [7] PRESENTATION FORM FOR VERTICAL COMMA..PRESENTATION FORM FOR VERTICAL QUESTION MARK +FE17 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET +FE18 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET +FE19 ; Common # Po PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS +FE30 ; Common # Po PRESENTATION FORM FOR VERTICAL TWO DOT LEADER +FE31..FE32 ; Common # Pd [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH +FE33..FE34 ; Common # Pc [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE +FE35 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS +FE36 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS +FE37 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET +FE38 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET +FE39 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET +FE3A ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET +FE3B ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET +FE3C ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET +FE3D ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET +FE3E ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET +FE3F ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET +FE40 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET +FE41 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET +FE42 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET +FE43 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET +FE44 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET +FE45..FE46 ; Common # Po [2] SESAME DOT..WHITE SESAME DOT +FE47 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET +FE48 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET +FE49..FE4C ; Common # Po [4] DASHED OVERLINE..DOUBLE WAVY OVERLINE +FE4D..FE4F ; Common # Pc [3] DASHED LOW LINE..WAVY LOW LINE +FE50..FE52 ; Common # Po [3] SMALL COMMA..SMALL FULL STOP +FE54..FE57 ; Common # Po [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK +FE58 ; Common # Pd SMALL EM DASH +FE59 ; Common # Ps SMALL LEFT PARENTHESIS +FE5A ; Common # Pe SMALL RIGHT PARENTHESIS +FE5B ; Common # Ps SMALL LEFT CURLY BRACKET +FE5C ; Common # Pe SMALL RIGHT CURLY BRACKET +FE5D ; Common # Ps SMALL LEFT TORTOISE SHELL BRACKET +FE5E ; Common # Pe SMALL RIGHT TORTOISE SHELL BRACKET +FE5F..FE61 ; Common # Po [3] SMALL NUMBER SIGN..SMALL ASTERISK +FE62 ; Common # Sm SMALL PLUS SIGN +FE63 ; Common # Pd SMALL HYPHEN-MINUS +FE64..FE66 ; Common # Sm [3] SMALL LESS-THAN SIGN..SMALL EQUALS SIGN +FE68 ; Common # Po SMALL REVERSE SOLIDUS +FE69 ; Common # Sc SMALL DOLLAR SIGN +FE6A..FE6B ; Common # Po [2] SMALL PERCENT SIGN..SMALL COMMERCIAL AT +FEFF ; Common # Cf ZERO WIDTH NO-BREAK SPACE +FF01..FF03 ; Common # Po [3] FULLWIDTH EXCLAMATION MARK..FULLWIDTH NUMBER SIGN +FF04 ; Common # Sc FULLWIDTH DOLLAR SIGN +FF05..FF07 ; Common # Po [3] FULLWIDTH PERCENT SIGN..FULLWIDTH APOSTROPHE +FF08 ; Common # Ps FULLWIDTH LEFT PARENTHESIS +FF09 ; Common # Pe FULLWIDTH RIGHT PARENTHESIS +FF0A ; Common # Po FULLWIDTH ASTERISK +FF0B ; Common # Sm FULLWIDTH PLUS SIGN +FF0C ; Common # Po FULLWIDTH COMMA +FF0D ; Common # Pd FULLWIDTH HYPHEN-MINUS +FF0E..FF0F ; Common # Po [2] FULLWIDTH FULL STOP..FULLWIDTH SOLIDUS +FF10..FF19 ; Common # Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE +FF1A..FF1B ; Common # Po [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON +FF1C..FF1E ; Common # Sm [3] FULLWIDTH LESS-THAN SIGN..FULLWIDTH GREATER-THAN SIGN +FF1F..FF20 ; Common # Po [2] FULLWIDTH QUESTION MARK..FULLWIDTH COMMERCIAL AT +FF3B ; Common # Ps FULLWIDTH LEFT SQUARE BRACKET +FF3C ; Common # Po FULLWIDTH REVERSE SOLIDUS +FF3D ; Common # Pe FULLWIDTH RIGHT SQUARE BRACKET +FF3E ; Common # Sk FULLWIDTH CIRCUMFLEX ACCENT +FF3F ; Common # Pc FULLWIDTH LOW LINE +FF40 ; Common # Sk FULLWIDTH GRAVE ACCENT +FF5B ; Common # Ps FULLWIDTH LEFT CURLY BRACKET +FF5C ; Common # Sm FULLWIDTH VERTICAL LINE +FF5D ; Common # Pe FULLWIDTH RIGHT CURLY BRACKET +FF5E ; Common # Sm FULLWIDTH TILDE +FF5F ; Common # Ps FULLWIDTH LEFT WHITE PARENTHESIS +FF60 ; Common # Pe FULLWIDTH RIGHT WHITE PARENTHESIS +FF61 ; Common # Po HALFWIDTH IDEOGRAPHIC FULL STOP +FF62 ; Common # Ps HALFWIDTH LEFT CORNER BRACKET +FF63 ; Common # Pe HALFWIDTH RIGHT CORNER BRACKET +FF64..FF65 ; Common # Po [2] HALFWIDTH IDEOGRAPHIC COMMA..HALFWIDTH KATAKANA MIDDLE DOT +FF70 ; Common # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +FF9E..FF9F ; Common # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK +FFE0..FFE1 ; Common # Sc [2] FULLWIDTH CENT SIGN..FULLWIDTH POUND SIGN +FFE2 ; Common # Sm FULLWIDTH NOT SIGN +FFE3 ; Common # Sk FULLWIDTH MACRON +FFE4 ; Common # So FULLWIDTH BROKEN BAR +FFE5..FFE6 ; Common # Sc [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN +FFE8 ; Common # So HALFWIDTH FORMS LIGHT VERTICAL +FFE9..FFEC ; Common # Sm [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW +FFED..FFEE ; Common # So [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE +FFF9..FFFB ; Common # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR +FFFC..FFFD ; Common # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTER +10100..10102 ; Common # Po [3] AEGEAN WORD SEPARATOR LINE..AEGEAN CHECK MARK +10107..10133 ; Common # No [45] AEGEAN NUMBER ONE..AEGEAN NUMBER NINETY THOUSAND +10137..1013F ; Common # So [9] AEGEAN WEIGHT BASE UNIT..AEGEAN MEASURE THIRD SUBUNIT +10190..1019C ; Common # So [13] ROMAN SEXTANS SIGN..ASCIA SYMBOL +101D0..101FC ; Common # So [45] PHAISTOS DISC SIGN PEDESTRIAN..PHAISTOS DISC SIGN WAVY BAND +102E1..102FB ; Common # No [27] COPTIC EPACT DIGIT ONE..COPTIC EPACT NUMBER NINE HUNDRED +1BCA0..1BCA3 ; Common # Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP +1CF50..1CFC3 ; Common # So [116] ZNAMENNY NEUME KRYUK..ZNAMENNY NEUME PAUK +1D000..1D0F5 ; Common # So [246] BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO +1D100..1D126 ; Common # So [39] MUSICAL SYMBOL SINGLE BARLINE..MUSICAL SYMBOL DRUM CLEF-2 +1D129..1D164 ; Common # So [60] MUSICAL SYMBOL MULTIPLE MEASURE REST..MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE +1D165..1D166 ; Common # Mc [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM +1D16A..1D16C ; Common # So [3] MUSICAL SYMBOL FINGERED TREMOLO-1..MUSICAL SYMBOL FINGERED TREMOLO-3 +1D16D..1D172 ; Common # Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5 +1D173..1D17A ; Common # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE +1D183..1D184 ; Common # So [2] MUSICAL SYMBOL ARPEGGIATO UP..MUSICAL SYMBOL ARPEGGIATO DOWN +1D18C..1D1A9 ; Common # So [30] MUSICAL SYMBOL RINFORZANDO..MUSICAL SYMBOL DEGREE SLASH +1D1AE..1D1EA ; Common # So [61] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL KORON +1D2C0..1D2D3 ; Common # No [20] KAKTOVIK NUMERAL ZERO..KAKTOVIK NUMERAL NINETEEN +1D2E0..1D2F3 ; Common # No [20] MAYAN NUMERAL ZERO..MAYAN NUMERAL NINETEEN +1D300..1D356 ; Common # So [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING +1D360..1D378 ; Common # No [25] COUNTING ROD UNIT DIGIT ONE..TALLY MARK FIVE +1D400..1D454 ; Common # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G +1D456..1D49C ; Common # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A +1D49E..1D49F ; Common # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D +1D4A2 ; Common # L& MATHEMATICAL SCRIPT CAPITAL G +1D4A5..1D4A6 ; Common # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K +1D4A9..1D4AC ; Common # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q +1D4AE..1D4B9 ; Common # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D +1D4BB ; Common # L& MATHEMATICAL SCRIPT SMALL F +1D4BD..1D4C3 ; Common # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N +1D4C5..1D505 ; Common # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B +1D507..1D50A ; Common # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G +1D50D..1D514 ; Common # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q +1D516..1D51C ; Common # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y +1D51E..1D539 ; Common # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B +1D53B..1D53E ; Common # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G +1D540..1D544 ; Common # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M +1D546 ; Common # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O +1D54A..1D550 ; Common # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +1D552..1D6A5 ; Common # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J +1D6A8..1D6C0 ; Common # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA +1D6C1 ; Common # Sm MATHEMATICAL BOLD NABLA +1D6C2..1D6DA ; Common # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA +1D6DB ; Common # Sm MATHEMATICAL BOLD PARTIAL DIFFERENTIAL +1D6DC..1D6FA ; Common # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA +1D6FB ; Common # Sm MATHEMATICAL ITALIC NABLA +1D6FC..1D714 ; Common # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA +1D715 ; Common # Sm MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL +1D716..1D734 ; Common # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA +1D735 ; Common # Sm MATHEMATICAL BOLD ITALIC NABLA +1D736..1D74E ; Common # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA +1D74F ; Common # Sm MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL +1D750..1D76E ; Common # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA +1D76F ; Common # Sm MATHEMATICAL SANS-SERIF BOLD NABLA +1D770..1D788 ; Common # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA +1D789 ; Common # Sm MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL +1D78A..1D7A8 ; Common # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA +1D7A9 ; Common # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA +1D7AA..1D7C2 ; Common # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA +1D7C3 ; Common # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL +1D7C4..1D7CB ; Common # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA +1D7CE..1D7FF ; Common # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE +1EC71..1ECAB ; Common # No [59] INDIC SIYAQ NUMBER ONE..INDIC SIYAQ NUMBER PREFIXED NINE +1ECAC ; Common # So INDIC SIYAQ PLACEHOLDER +1ECAD..1ECAF ; Common # No [3] INDIC SIYAQ FRACTION ONE QUARTER..INDIC SIYAQ FRACTION THREE QUARTERS +1ECB0 ; Common # Sc INDIC SIYAQ RUPEE MARK +1ECB1..1ECB4 ; Common # No [4] INDIC SIYAQ NUMBER ALTERNATE ONE..INDIC SIYAQ ALTERNATE LAKH MARK +1ED01..1ED2D ; Common # No [45] OTTOMAN SIYAQ NUMBER ONE..OTTOMAN SIYAQ NUMBER NINETY THOUSAND +1ED2E ; Common # So OTTOMAN SIYAQ MARRATAN +1ED2F..1ED3D ; Common # No [15] OTTOMAN SIYAQ ALTERNATE NUMBER TWO..OTTOMAN SIYAQ FRACTION ONE SIXTH +1F000..1F02B ; Common # So [44] MAHJONG TILE EAST WIND..MAHJONG TILE BACK +1F030..1F093 ; Common # So [100] DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06 +1F0A0..1F0AE ; Common # So [15] PLAYING CARD BACK..PLAYING CARD KING OF SPADES +1F0B1..1F0BF ; Common # So [15] PLAYING CARD ACE OF HEARTS..PLAYING CARD RED JOKER +1F0C1..1F0CF ; Common # So [15] PLAYING CARD ACE OF DIAMONDS..PLAYING CARD BLACK JOKER +1F0D1..1F0F5 ; Common # So [37] PLAYING CARD ACE OF CLUBS..PLAYING CARD TRUMP-21 +1F100..1F10C ; Common # No [13] DIGIT ZERO FULL STOP..DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO +1F10D..1F1AD ; Common # So [161] CIRCLED ZERO WITH SLASH..MASK WORK SYMBOL +1F1E6..1F1FF ; Common # So [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z +1F201..1F202 ; Common # So [2] SQUARED KATAKANA KOKO..SQUARED KATAKANA SA +1F210..1F23B ; Common # So [44] SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-914D +1F240..1F248 ; Common # So [9] TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C..TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 +1F250..1F251 ; Common # So [2] CIRCLED IDEOGRAPH ADVANTAGE..CIRCLED IDEOGRAPH ACCEPT +1F260..1F265 ; Common # So [6] ROUNDED SYMBOL FOR FU..ROUNDED SYMBOL FOR CAI +1F300..1F3FA ; Common # So [251] CYCLONE..AMPHORA +1F3FB..1F3FF ; Common # Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6 +1F400..1F6D7 ; Common # So [728] RAT..ELEVATOR +1F6DC..1F6EC ; Common # So [17] WIRELESS..AIRPLANE ARRIVING +1F6F0..1F6FC ; Common # So [13] SATELLITE..ROLLER SKATE +1F700..1F776 ; Common # So [119] ALCHEMICAL SYMBOL FOR QUINTESSENCE..LUNAR ECLIPSE +1F77B..1F7D9 ; Common # So [95] HAUMEA..NINE POINTED WHITE STAR +1F7E0..1F7EB ; Common # So [12] LARGE ORANGE CIRCLE..LARGE BROWN SQUARE +1F7F0 ; Common # So HEAVY EQUALS SIGN +1F800..1F80B ; Common # So [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD +1F810..1F847 ; Common # So [56] LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD..DOWNWARDS HEAVY ARROW +1F850..1F859 ; Common # So [10] LEFTWARDS SANS-SERIF ARROW..UP DOWN SANS-SERIF ARROW +1F860..1F887 ; Common # So [40] WIDE-HEADED LEFTWARDS LIGHT BARB ARROW..WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW +1F890..1F8AD ; Common # So [30] LEFTWARDS TRIANGLE ARROWHEAD..WHITE ARROW SHAFT WIDTH TWO THIRDS +1F8B0..1F8B1 ; Common # So [2] ARROW POINTING UPWARDS THEN NORTH WEST..ARROW POINTING RIGHTWARDS THEN CURVING SOUTH WEST +1F900..1FA53 ; Common # So [340] CIRCLED CROSS FORMEE WITH FOUR DOTS..BLACK CHESS KNIGHT-BISHOP +1FA60..1FA6D ; Common # So [14] XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER +1FA70..1FA7C ; Common # So [13] BALLET SHOES..CRUTCH +1FA80..1FA88 ; Common # So [9] YO-YO..FLUTE +1FA90..1FABD ; Common # So [46] RINGED PLANET..WING +1FABF..1FAC5 ; Common # So [7] GOOSE..PERSON WITH CROWN +1FACE..1FADB ; Common # So [14] MOOSE..PEA POD +1FAE0..1FAE8 ; Common # So [9] MELTING FACE..SHAKING FACE +1FAF0..1FAF8 ; Common # So [9] HAND WITH INDEX FINGER AND THUMB CROSSED..RIGHTWARDS PUSHING HAND +1FB00..1FB92 ; Common # So [147] BLOCK SEXTANT-1..UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK +1FB94..1FBCA ; Common # So [55] LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK..WHITE UP-POINTING CHEVRON +1FBF0..1FBF9 ; Common # Nd [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE +E0001 ; Common # Cf LANGUAGE TAG +E0020..E007F ; Common # Cf [96] TAG SPACE..CANCEL TAG + +# Total code points: 8306 + +# ================================================ + +0041..005A ; Latin # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z +0061..007A ; Latin # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z +00AA ; Latin # Lo FEMININE ORDINAL INDICATOR +00BA ; Latin # Lo MASCULINE ORDINAL INDICATOR +00C0..00D6 ; Latin # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS +00D8..00F6 ; Latin # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS +00F8..01BA ; Latin # L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL +01BB ; Latin # Lo LATIN LETTER TWO WITH STROKE +01BC..01BF ; Latin # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN +01C0..01C3 ; Latin # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK +01C4..0293 ; Latin # L& [208] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER EZH WITH CURL +0294 ; Latin # Lo LATIN LETTER GLOTTAL STOP +0295..02AF ; Latin # L& [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL +02B0..02B8 ; Latin # Lm [9] MODIFIER LETTER SMALL H..MODIFIER LETTER SMALL Y +02E0..02E4 ; Latin # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +1D00..1D25 ; Latin # L& [38] LATIN LETTER SMALL CAPITAL A..LATIN LETTER AIN +1D2C..1D5C ; Latin # Lm [49] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL AIN +1D62..1D65 ; Latin # Lm [4] LATIN SUBSCRIPT SMALL LETTER I..LATIN SUBSCRIPT SMALL LETTER V +1D6B..1D77 ; Latin # L& [13] LATIN SMALL LETTER UE..LATIN SMALL LETTER TURNED G +1D79..1D9A ; Latin # L& [34] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK +1D9B..1DBE ; Latin # Lm [36] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL EZH +1E00..1EFF ; Latin # L& [256] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER Y WITH LOOP +2071 ; Latin # Lm SUPERSCRIPT LATIN SMALL LETTER I +207F ; Latin # Lm SUPERSCRIPT LATIN SMALL LETTER N +2090..209C ; Latin # Lm [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T +212A..212B ; Latin # L& [2] KELVIN SIGN..ANGSTROM SIGN +2132 ; Latin # L& TURNED CAPITAL F +214E ; Latin # L& TURNED SMALL F +2160..2182 ; Latin # Nl [35] ROMAN NUMERAL ONE..ROMAN NUMERAL TEN THOUSAND +2183..2184 ; Latin # L& [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C +2185..2188 ; Latin # Nl [4] ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND +2C60..2C7B ; Latin # L& [28] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN LETTER SMALL CAPITAL TURNED E +2C7C..2C7D ; Latin # Lm [2] LATIN SUBSCRIPT SMALL LETTER J..MODIFIER LETTER CAPITAL V +2C7E..2C7F ; Latin # L& [2] LATIN CAPITAL LETTER S WITH SWASH TAIL..LATIN CAPITAL LETTER Z WITH SWASH TAIL +A722..A76F ; Latin # L& [78] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN SMALL LETTER CON +A770 ; Latin # Lm MODIFIER LETTER US +A771..A787 ; Latin # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T +A78B..A78E ; Latin # L& [4] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT +A78F ; Latin # Lo LATIN LETTER SINOLOGICAL DOT +A790..A7CA ; Latin # L& [59] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN SMALL LETTER S WITH SHORT STROKE OVERLAY +A7D0..A7D1 ; Latin # L& [2] LATIN CAPITAL LETTER CLOSED INSULAR G..LATIN SMALL LETTER CLOSED INSULAR G +A7D3 ; Latin # L& LATIN SMALL LETTER DOUBLE THORN +A7D5..A7D9 ; Latin # L& [5] LATIN SMALL LETTER DOUBLE WYNN..LATIN SMALL LETTER SIGMOID S +A7F2..A7F4 ; Latin # Lm [3] MODIFIER LETTER CAPITAL C..MODIFIER LETTER CAPITAL Q +A7F5..A7F6 ; Latin # L& [2] LATIN CAPITAL LETTER REVERSED HALF H..LATIN SMALL LETTER REVERSED HALF H +A7F7 ; Latin # Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I +A7F8..A7F9 ; Latin # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE +A7FA ; Latin # L& LATIN LETTER SMALL CAPITAL TURNED M +A7FB..A7FF ; Latin # Lo [5] LATIN EPIGRAPHIC LETTER REVERSED F..LATIN EPIGRAPHIC LETTER ARCHAIC M +AB30..AB5A ; Latin # L& [43] LATIN SMALL LETTER BARRED ALPHA..LATIN SMALL LETTER Y WITH SHORT RIGHT LEG +AB5C..AB5F ; Latin # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK +AB60..AB64 ; Latin # L& [5] LATIN SMALL LETTER SAKHA YAT..LATIN SMALL LETTER INVERTED ALPHA +AB66..AB68 ; Latin # L& [3] LATIN SMALL LETTER DZ DIGRAPH WITH RETROFLEX HOOK..LATIN SMALL LETTER TURNED R WITH MIDDLE TILDE +AB69 ; Latin # Lm MODIFIER LETTER SMALL TURNED W +FB00..FB06 ; Latin # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST +FF21..FF3A ; Latin # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z +FF41..FF5A ; Latin # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z +10780..10785 ; Latin # Lm [6] MODIFIER LETTER SMALL CAPITAL AA..MODIFIER LETTER SMALL B WITH HOOK +10787..107B0 ; Latin # Lm [42] MODIFIER LETTER SMALL DZ DIGRAPH..MODIFIER LETTER SMALL V WITH RIGHT HOOK +107B2..107BA ; Latin # Lm [9] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL S WITH CURL +1DF00..1DF09 ; Latin # L& [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK +1DF0A ; Latin # Lo LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK +1DF0B..1DF1E ; Latin # L& [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL +1DF25..1DF2A ; Latin # L& [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK + +# Total code points: 1481 + +# ================================================ + +0370..0373 ; Greek # L& [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI +0375 ; Greek # Sk GREEK LOWER NUMERAL SIGN +0376..0377 ; Greek # L& [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA +037A ; Greek # Lm GREEK YPOGEGRAMMENI +037B..037D ; Greek # L& [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL +037F ; Greek # L& GREEK CAPITAL LETTER YOT +0384 ; Greek # Sk GREEK TONOS +0386 ; Greek # L& GREEK CAPITAL LETTER ALPHA WITH TONOS +0388..038A ; Greek # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS +038C ; Greek # L& GREEK CAPITAL LETTER OMICRON WITH TONOS +038E..03A1 ; Greek # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO +03A3..03E1 ; Greek # L& [63] GREEK CAPITAL LETTER SIGMA..GREEK SMALL LETTER SAMPI +03F0..03F5 ; Greek # L& [6] GREEK KAPPA SYMBOL..GREEK LUNATE EPSILON SYMBOL +03F6 ; Greek # Sm GREEK REVERSED LUNATE EPSILON SYMBOL +03F7..03FF ; Greek # L& [9] GREEK CAPITAL LETTER SHO..GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL +1D26..1D2A ; Greek # L& [5] GREEK LETTER SMALL CAPITAL GAMMA..GREEK LETTER SMALL CAPITAL PSI +1D5D..1D61 ; Greek # Lm [5] MODIFIER LETTER SMALL BETA..MODIFIER LETTER SMALL CHI +1D66..1D6A ; Greek # Lm [5] GREEK SUBSCRIPT SMALL LETTER BETA..GREEK SUBSCRIPT SMALL LETTER CHI +1DBF ; Greek # Lm MODIFIER LETTER SMALL THETA +1F00..1F15 ; Greek # L& [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA +1F18..1F1D ; Greek # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F20..1F45 ; Greek # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA +1F48..1F4D ; Greek # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F50..1F57 ; Greek # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F59 ; Greek # L& GREEK CAPITAL LETTER UPSILON WITH DASIA +1F5B ; Greek # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F5D ; Greek # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F5F..1F7D ; Greek # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA +1F80..1FB4 ; Greek # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FB6..1FBC ; Greek # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBD ; Greek # Sk GREEK KORONIS +1FBE ; Greek # L& GREEK PROSGEGRAMMENI +1FBF..1FC1 ; Greek # Sk [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI +1FC2..1FC4 ; Greek # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FC6..1FCC ; Greek # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FCD..1FCF ; Greek # Sk [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI +1FD0..1FD3 ; Greek # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6..1FDB ; Greek # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA +1FDD..1FDF ; Greek # Sk [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI +1FE0..1FEC ; Greek # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA +1FED..1FEF ; Greek # Sk [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA +1FF2..1FF4 ; Greek # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1FF6..1FFC ; Greek # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +1FFD..1FFE ; Greek # Sk [2] GREEK OXIA..GREEK DASIA +2126 ; Greek # L& OHM SIGN +AB65 ; Greek # L& GREEK LETTER SMALL CAPITAL OMEGA +10140..10174 ; Greek # Nl [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS +10175..10178 ; Greek # No [4] GREEK ONE HALF SIGN..GREEK THREE QUARTERS SIGN +10179..10189 ; Greek # So [17] GREEK YEAR SIGN..GREEK TRYBLION BASE SIGN +1018A..1018B ; Greek # No [2] GREEK ZERO SIGN..GREEK ONE QUARTER SIGN +1018C..1018E ; Greek # So [3] GREEK SINUSOID SIGN..NOMISMA SIGN +101A0 ; Greek # So GREEK SYMBOL TAU RHO +1D200..1D241 ; Greek # So [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54 +1D242..1D244 ; Greek # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME +1D245 ; Greek # So GREEK MUSICAL LEIMMA + +# Total code points: 518 + +# ================================================ + +0400..0481 ; Cyrillic # L& [130] CYRILLIC CAPITAL LETTER IE WITH GRAVE..CYRILLIC SMALL LETTER KOPPA +0482 ; Cyrillic # So CYRILLIC THOUSANDS SIGN +0483..0484 ; Cyrillic # Mn [2] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC PALATALIZATION +0487 ; Cyrillic # Mn COMBINING CYRILLIC POKRYTIE +0488..0489 ; Cyrillic # Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN +048A..052F ; Cyrillic # L& [166] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EL WITH DESCENDER +1C80..1C88 ; Cyrillic # L& [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK +1D2B ; Cyrillic # L& CYRILLIC LETTER SMALL CAPITAL EL +1D78 ; Cyrillic # Lm MODIFIER LETTER CYRILLIC EN +2DE0..2DFF ; Cyrillic # Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS +A640..A66D ; Cyrillic # L& [46] CYRILLIC CAPITAL LETTER ZEMLYA..CYRILLIC SMALL LETTER DOUBLE MONOCULAR O +A66E ; Cyrillic # Lo CYRILLIC LETTER MULTIOCULAR O +A66F ; Cyrillic # Mn COMBINING CYRILLIC VZMET +A670..A672 ; Cyrillic # Me [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN +A673 ; Cyrillic # Po SLAVONIC ASTERISK +A674..A67D ; Cyrillic # Mn [10] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC PAYEROK +A67E ; Cyrillic # Po CYRILLIC KAVYKA +A67F ; Cyrillic # Lm CYRILLIC PAYEROK +A680..A69B ; Cyrillic # L& [28] CYRILLIC CAPITAL LETTER DWE..CYRILLIC SMALL LETTER CROSSED O +A69C..A69D ; Cyrillic # Lm [2] MODIFIER LETTER CYRILLIC HARD SIGN..MODIFIER LETTER CYRILLIC SOFT SIGN +A69E..A69F ; Cyrillic # Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E +FE2E..FE2F ; Cyrillic # Mn [2] COMBINING CYRILLIC TITLO LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF +1E030..1E06D ; Cyrillic # Lm [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE +1E08F ; Cyrillic # Mn COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + +# Total code points: 506 + +# ================================================ + +0531..0556 ; Armenian # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH +0559 ; Armenian # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING +055A..055F ; Armenian # Po [6] ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK +0560..0588 ; Armenian # L& [41] ARMENIAN SMALL LETTER TURNED AYB..ARMENIAN SMALL LETTER YI WITH STROKE +0589 ; Armenian # Po ARMENIAN FULL STOP +058A ; Armenian # Pd ARMENIAN HYPHEN +058D..058E ; Armenian # So [2] RIGHT-FACING ARMENIAN ETERNITY SIGN..LEFT-FACING ARMENIAN ETERNITY SIGN +058F ; Armenian # Sc ARMENIAN DRAM SIGN +FB13..FB17 ; Armenian # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH + +# Total code points: 96 + +# ================================================ + +0591..05BD ; Hebrew # Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG +05BE ; Hebrew # Pd HEBREW PUNCTUATION MAQAF +05BF ; Hebrew # Mn HEBREW POINT RAFE +05C0 ; Hebrew # Po HEBREW PUNCTUATION PASEQ +05C1..05C2 ; Hebrew # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT +05C3 ; Hebrew # Po HEBREW PUNCTUATION SOF PASUQ +05C4..05C5 ; Hebrew # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT +05C6 ; Hebrew # Po HEBREW PUNCTUATION NUN HAFUKHA +05C7 ; Hebrew # Mn HEBREW POINT QAMATS QATAN +05D0..05EA ; Hebrew # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV +05EF..05F2 ; Hebrew # Lo [4] HEBREW YOD TRIANGLE..HEBREW LIGATURE YIDDISH DOUBLE YOD +05F3..05F4 ; Hebrew # Po [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM +FB1D ; Hebrew # Lo HEBREW LETTER YOD WITH HIRIQ +FB1E ; Hebrew # Mn HEBREW POINT JUDEO-SPANISH VARIKA +FB1F..FB28 ; Hebrew # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV +FB29 ; Hebrew # Sm HEBREW LETTER ALTERNATIVE PLUS SIGN +FB2A..FB36 ; Hebrew # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH +FB38..FB3C ; Hebrew # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH +FB3E ; Hebrew # Lo HEBREW LETTER MEM WITH DAGESH +FB40..FB41 ; Hebrew # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH +FB43..FB44 ; Hebrew # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH +FB46..FB4F ; Hebrew # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATURE ALEF LAMED + +# Total code points: 134 + +# ================================================ + +0600..0604 ; Arabic # Cf [5] ARABIC NUMBER SIGN..ARABIC SIGN SAMVAT +0606..0608 ; Arabic # Sm [3] ARABIC-INDIC CUBE ROOT..ARABIC RAY +0609..060A ; Arabic # Po [2] ARABIC-INDIC PER MILLE SIGN..ARABIC-INDIC PER TEN THOUSAND SIGN +060B ; Arabic # Sc AFGHANI SIGN +060D ; Arabic # Po ARABIC DATE SEPARATOR +060E..060F ; Arabic # So [2] ARABIC POETIC VERSE SIGN..ARABIC SIGN MISRA +0610..061A ; Arabic # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA +061C ; Arabic # Cf ARABIC LETTER MARK +061D..061E ; Arabic # Po [2] ARABIC END OF TEXT MARK..ARABIC TRIPLE DOT PUNCTUATION MARK +0620..063F ; Arabic # Lo [32] ARABIC LETTER KASHMIRI YEH..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE +0641..064A ; Arabic # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH +0656..065F ; Arabic # Mn [10] ARABIC SUBSCRIPT ALEF..ARABIC WAVY HAMZA BELOW +0660..0669 ; Arabic # Nd [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE +066A..066D ; Arabic # Po [4] ARABIC PERCENT SIGN..ARABIC FIVE POINTED STAR +066E..066F ; Arabic # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF +0671..06D3 ; Arabic # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE +06D4 ; Arabic # Po ARABIC FULL STOP +06D5 ; Arabic # Lo ARABIC LETTER AE +06D6..06DC ; Arabic # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN +06DE ; Arabic # So ARABIC START OF RUB EL HIZB +06DF..06E4 ; Arabic # Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA +06E5..06E6 ; Arabic # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH +06E7..06E8 ; Arabic # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON +06E9 ; Arabic # So ARABIC PLACE OF SAJDAH +06EA..06ED ; Arabic # Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM +06EE..06EF ; Arabic # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V +06F0..06F9 ; Arabic # Nd [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE +06FA..06FC ; Arabic # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW +06FD..06FE ; Arabic # So [2] ARABIC SIGN SINDHI AMPERSAND..ARABIC SIGN SINDHI POSTPOSITION MEN +06FF ; Arabic # Lo ARABIC LETTER HEH WITH INVERTED V +0750..077F ; Arabic # Lo [48] ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW..ARABIC LETTER KAF WITH TWO DOTS ABOVE +0870..0887 ; Arabic # Lo [24] ARABIC LETTER ALEF WITH ATTACHED FATHA..ARABIC BASELINE ROUND DOT +0888 ; Arabic # Sk ARABIC RAISED ROUND DOT +0889..088E ; Arabic # Lo [6] ARABIC LETTER NOON WITH INVERTED SMALL V..ARABIC VERTICAL TAIL +0890..0891 ; Arabic # Cf [2] ARABIC POUND MARK ABOVE..ARABIC PIASTRE MARK ABOVE +0898..089F ; Arabic # Mn [8] ARABIC SMALL HIGH WORD AL-JUZ..ARABIC HALF MADDA OVER MADDA +08A0..08C8 ; Arabic # Lo [41] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER GRAF +08C9 ; Arabic # Lm ARABIC SMALL FARSI YEH +08CA..08E1 ; Arabic # Mn [24] ARABIC SMALL HIGH FARSI YEH..ARABIC SMALL HIGH SIGN SAFHA +08E3..08FF ; Arabic # Mn [29] ARABIC TURNED DAMMA BELOW..ARABIC MARK SIDEWAYS NOON GHUNNA +FB50..FBB1 ; Arabic # Lo [98] ARABIC LETTER ALEF WASLA ISOLATED FORM..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM +FBB2..FBC2 ; Arabic # Sk [17] ARABIC SYMBOL DOT ABOVE..ARABIC SYMBOL WASLA ABOVE +FBD3..FD3D ; Arabic # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM +FD40..FD4F ; Arabic # So [16] ARABIC LIGATURE RAHIMAHU ALLAAH..ARABIC LIGATURE RAHIMAHUM ALLAAH +FD50..FD8F ; Arabic # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM +FD92..FDC7 ; Arabic # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM +FDCF ; Arabic # So ARABIC LIGATURE SALAAMUHU ALAYNAA +FDF0..FDFB ; Arabic # Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU +FDFC ; Arabic # Sc RIAL SIGN +FDFD..FDFF ; Arabic # So [3] ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM..ARABIC LIGATURE AZZA WA JALL +FE70..FE74 ; Arabic # Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM +FE76..FEFC ; Arabic # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM +10E60..10E7E ; Arabic # No [31] RUMI DIGIT ONE..RUMI FRACTION TWO THIRDS +10EFD..10EFF ; Arabic # Mn [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA +1EE00..1EE03 ; Arabic # Lo [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL +1EE05..1EE1F ; Arabic # Lo [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF +1EE21..1EE22 ; Arabic # Lo [2] ARABIC MATHEMATICAL INITIAL BEH..ARABIC MATHEMATICAL INITIAL JEEM +1EE24 ; Arabic # Lo ARABIC MATHEMATICAL INITIAL HEH +1EE27 ; Arabic # Lo ARABIC MATHEMATICAL INITIAL HAH +1EE29..1EE32 ; Arabic # Lo [10] ARABIC MATHEMATICAL INITIAL YEH..ARABIC MATHEMATICAL INITIAL QAF +1EE34..1EE37 ; Arabic # Lo [4] ARABIC MATHEMATICAL INITIAL SHEEN..ARABIC MATHEMATICAL INITIAL KHAH +1EE39 ; Arabic # Lo ARABIC MATHEMATICAL INITIAL DAD +1EE3B ; Arabic # Lo ARABIC MATHEMATICAL INITIAL GHAIN +1EE42 ; Arabic # Lo ARABIC MATHEMATICAL TAILED JEEM +1EE47 ; Arabic # Lo ARABIC MATHEMATICAL TAILED HAH +1EE49 ; Arabic # Lo ARABIC MATHEMATICAL TAILED YEH +1EE4B ; Arabic # Lo ARABIC MATHEMATICAL TAILED LAM +1EE4D..1EE4F ; Arabic # Lo [3] ARABIC MATHEMATICAL TAILED NOON..ARABIC MATHEMATICAL TAILED AIN +1EE51..1EE52 ; Arabic # Lo [2] ARABIC MATHEMATICAL TAILED SAD..ARABIC MATHEMATICAL TAILED QAF +1EE54 ; Arabic # Lo ARABIC MATHEMATICAL TAILED SHEEN +1EE57 ; Arabic # Lo ARABIC MATHEMATICAL TAILED KHAH +1EE59 ; Arabic # Lo ARABIC MATHEMATICAL TAILED DAD +1EE5B ; Arabic # Lo ARABIC MATHEMATICAL TAILED GHAIN +1EE5D ; Arabic # Lo ARABIC MATHEMATICAL TAILED DOTLESS NOON +1EE5F ; Arabic # Lo ARABIC MATHEMATICAL TAILED DOTLESS QAF +1EE61..1EE62 ; Arabic # Lo [2] ARABIC MATHEMATICAL STRETCHED BEH..ARABIC MATHEMATICAL STRETCHED JEEM +1EE64 ; Arabic # Lo ARABIC MATHEMATICAL STRETCHED HEH +1EE67..1EE6A ; Arabic # Lo [4] ARABIC MATHEMATICAL STRETCHED HAH..ARABIC MATHEMATICAL STRETCHED KAF +1EE6C..1EE72 ; Arabic # Lo [7] ARABIC MATHEMATICAL STRETCHED MEEM..ARABIC MATHEMATICAL STRETCHED QAF +1EE74..1EE77 ; Arabic # Lo [4] ARABIC MATHEMATICAL STRETCHED SHEEN..ARABIC MATHEMATICAL STRETCHED KHAH +1EE79..1EE7C ; Arabic # Lo [4] ARABIC MATHEMATICAL STRETCHED DAD..ARABIC MATHEMATICAL STRETCHED DOTLESS BEH +1EE7E ; Arabic # Lo ARABIC MATHEMATICAL STRETCHED DOTLESS FEH +1EE80..1EE89 ; Arabic # Lo [10] ARABIC MATHEMATICAL LOOPED ALEF..ARABIC MATHEMATICAL LOOPED YEH +1EE8B..1EE9B ; Arabic # Lo [17] ARABIC MATHEMATICAL LOOPED LAM..ARABIC MATHEMATICAL LOOPED GHAIN +1EEA1..1EEA3 ; Arabic # Lo [3] ARABIC MATHEMATICAL DOUBLE-STRUCK BEH..ARABIC MATHEMATICAL DOUBLE-STRUCK DAL +1EEA5..1EEA9 ; Arabic # Lo [5] ARABIC MATHEMATICAL DOUBLE-STRUCK WAW..ARABIC MATHEMATICAL DOUBLE-STRUCK YEH +1EEAB..1EEBB ; Arabic # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN +1EEF0..1EEF1 ; Arabic # Sm [2] ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL..ARABIC MATHEMATICAL OPERATOR HAH WITH DAL + +# Total code points: 1368 + +# ================================================ + +0700..070D ; Syriac # Po [14] SYRIAC END OF PARAGRAPH..SYRIAC HARKLEAN ASTERISCUS +070F ; Syriac # Cf SYRIAC ABBREVIATION MARK +0710 ; Syriac # Lo SYRIAC LETTER ALAPH +0711 ; Syriac # Mn SYRIAC LETTER SUPERSCRIPT ALAPH +0712..072F ; Syriac # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH +0730..074A ; Syriac # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH +074D..074F ; Syriac # Lo [3] SYRIAC LETTER SOGDIAN ZHAIN..SYRIAC LETTER SOGDIAN FE +0860..086A ; Syriac # Lo [11] SYRIAC LETTER MALAYALAM NGA..SYRIAC LETTER MALAYALAM SSA + +# Total code points: 88 + +# ================================================ + +0780..07A5 ; Thaana # Lo [38] THAANA LETTER HAA..THAANA LETTER WAAVU +07A6..07B0 ; Thaana # Mn [11] THAANA ABAFILI..THAANA SUKUN +07B1 ; Thaana # Lo THAANA LETTER NAA + +# Total code points: 50 + +# ================================================ + +0900..0902 ; Devanagari # Mn [3] DEVANAGARI SIGN INVERTED CANDRABINDU..DEVANAGARI SIGN ANUSVARA +0903 ; Devanagari # Mc DEVANAGARI SIGN VISARGA +0904..0939 ; Devanagari # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA +093A ; Devanagari # Mn DEVANAGARI VOWEL SIGN OE +093B ; Devanagari # Mc DEVANAGARI VOWEL SIGN OOE +093C ; Devanagari # Mn DEVANAGARI SIGN NUKTA +093D ; Devanagari # Lo DEVANAGARI SIGN AVAGRAHA +093E..0940 ; Devanagari # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II +0941..0948 ; Devanagari # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI +0949..094C ; Devanagari # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU +094D ; Devanagari # Mn DEVANAGARI SIGN VIRAMA +094E..094F ; Devanagari # Mc [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW +0950 ; Devanagari # Lo DEVANAGARI OM +0955..0957 ; Devanagari # Mn [3] DEVANAGARI VOWEL SIGN CANDRA LONG E..DEVANAGARI VOWEL SIGN UUE +0958..0961 ; Devanagari # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL +0962..0963 ; Devanagari # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL +0966..096F ; Devanagari # Nd [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE +0970 ; Devanagari # Po DEVANAGARI ABBREVIATION SIGN +0971 ; Devanagari # Lm DEVANAGARI SIGN HIGH SPACING DOT +0972..097F ; Devanagari # Lo [14] DEVANAGARI LETTER CANDRA A..DEVANAGARI LETTER BBA +A8E0..A8F1 ; Devanagari # Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA +A8F2..A8F7 ; Devanagari # Lo [6] DEVANAGARI SIGN SPACING CANDRABINDU..DEVANAGARI SIGN CANDRABINDU AVAGRAHA +A8F8..A8FA ; Devanagari # Po [3] DEVANAGARI SIGN PUSHPIKA..DEVANAGARI CARET +A8FB ; Devanagari # Lo DEVANAGARI HEADSTROKE +A8FC ; Devanagari # Po DEVANAGARI SIGN SIDDHAM +A8FD..A8FE ; Devanagari # Lo [2] DEVANAGARI JAIN OM..DEVANAGARI LETTER AY +A8FF ; Devanagari # Mn DEVANAGARI VOWEL SIGN AY +11B00..11B09 ; Devanagari # Po [10] DEVANAGARI HEAD MARK..DEVANAGARI SIGN MINDU + +# Total code points: 164 + +# ================================================ + +0980 ; Bengali # Lo BENGALI ANJI +0981 ; Bengali # Mn BENGALI SIGN CANDRABINDU +0982..0983 ; Bengali # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA +0985..098C ; Bengali # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L +098F..0990 ; Bengali # Lo [2] BENGALI LETTER E..BENGALI LETTER AI +0993..09A8 ; Bengali # Lo [22] BENGALI LETTER O..BENGALI LETTER NA +09AA..09B0 ; Bengali # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA +09B2 ; Bengali # Lo BENGALI LETTER LA +09B6..09B9 ; Bengali # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA +09BC ; Bengali # Mn BENGALI SIGN NUKTA +09BD ; Bengali # Lo BENGALI SIGN AVAGRAHA +09BE..09C0 ; Bengali # Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II +09C1..09C4 ; Bengali # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR +09C7..09C8 ; Bengali # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI +09CB..09CC ; Bengali # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU +09CD ; Bengali # Mn BENGALI SIGN VIRAMA +09CE ; Bengali # Lo BENGALI LETTER KHANDA TA +09D7 ; Bengali # Mc BENGALI AU LENGTH MARK +09DC..09DD ; Bengali # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA +09DF..09E1 ; Bengali # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL +09E2..09E3 ; Bengali # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL +09E6..09EF ; Bengali # Nd [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE +09F0..09F1 ; Bengali # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL +09F2..09F3 ; Bengali # Sc [2] BENGALI RUPEE MARK..BENGALI RUPEE SIGN +09F4..09F9 ; Bengali # No [6] BENGALI CURRENCY NUMERATOR ONE..BENGALI CURRENCY DENOMINATOR SIXTEEN +09FA ; Bengali # So BENGALI ISSHAR +09FB ; Bengali # Sc BENGALI GANDA MARK +09FC ; Bengali # Lo BENGALI LETTER VEDIC ANUSVARA +09FD ; Bengali # Po BENGALI ABBREVIATION SIGN +09FE ; Bengali # Mn BENGALI SANDHI MARK + +# Total code points: 96 + +# ================================================ + +0A01..0A02 ; Gurmukhi # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI +0A03 ; Gurmukhi # Mc GURMUKHI SIGN VISARGA +0A05..0A0A ; Gurmukhi # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU +0A0F..0A10 ; Gurmukhi # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI +0A13..0A28 ; Gurmukhi # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA +0A2A..0A30 ; Gurmukhi # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA +0A32..0A33 ; Gurmukhi # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA +0A35..0A36 ; Gurmukhi # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA +0A38..0A39 ; Gurmukhi # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA +0A3C ; Gurmukhi # Mn GURMUKHI SIGN NUKTA +0A3E..0A40 ; Gurmukhi # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II +0A41..0A42 ; Gurmukhi # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU +0A47..0A48 ; Gurmukhi # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI +0A4B..0A4D ; Gurmukhi # Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA +0A51 ; Gurmukhi # Mn GURMUKHI SIGN UDAAT +0A59..0A5C ; Gurmukhi # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA +0A5E ; Gurmukhi # Lo GURMUKHI LETTER FA +0A66..0A6F ; Gurmukhi # Nd [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE +0A70..0A71 ; Gurmukhi # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK +0A72..0A74 ; Gurmukhi # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR +0A75 ; Gurmukhi # Mn GURMUKHI SIGN YAKASH +0A76 ; Gurmukhi # Po GURMUKHI ABBREVIATION SIGN + +# Total code points: 80 + +# ================================================ + +0A81..0A82 ; Gujarati # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA +0A83 ; Gujarati # Mc GUJARATI SIGN VISARGA +0A85..0A8D ; Gujarati # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E +0A8F..0A91 ; Gujarati # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O +0A93..0AA8 ; Gujarati # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA +0AAA..0AB0 ; Gujarati # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA +0AB2..0AB3 ; Gujarati # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA +0AB5..0AB9 ; Gujarati # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA +0ABC ; Gujarati # Mn GUJARATI SIGN NUKTA +0ABD ; Gujarati # Lo GUJARATI SIGN AVAGRAHA +0ABE..0AC0 ; Gujarati # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II +0AC1..0AC5 ; Gujarati # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E +0AC7..0AC8 ; Gujarati # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI +0AC9 ; Gujarati # Mc GUJARATI VOWEL SIGN CANDRA O +0ACB..0ACC ; Gujarati # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU +0ACD ; Gujarati # Mn GUJARATI SIGN VIRAMA +0AD0 ; Gujarati # Lo GUJARATI OM +0AE0..0AE1 ; Gujarati # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL +0AE2..0AE3 ; Gujarati # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL +0AE6..0AEF ; Gujarati # Nd [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE +0AF0 ; Gujarati # Po GUJARATI ABBREVIATION SIGN +0AF1 ; Gujarati # Sc GUJARATI RUPEE SIGN +0AF9 ; Gujarati # Lo GUJARATI LETTER ZHA +0AFA..0AFF ; Gujarati # Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE + +# Total code points: 91 + +# ================================================ + +0B01 ; Oriya # Mn ORIYA SIGN CANDRABINDU +0B02..0B03 ; Oriya # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA +0B05..0B0C ; Oriya # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L +0B0F..0B10 ; Oriya # Lo [2] ORIYA LETTER E..ORIYA LETTER AI +0B13..0B28 ; Oriya # Lo [22] ORIYA LETTER O..ORIYA LETTER NA +0B2A..0B30 ; Oriya # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA +0B32..0B33 ; Oriya # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA +0B35..0B39 ; Oriya # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA +0B3C ; Oriya # Mn ORIYA SIGN NUKTA +0B3D ; Oriya # Lo ORIYA SIGN AVAGRAHA +0B3E ; Oriya # Mc ORIYA VOWEL SIGN AA +0B3F ; Oriya # Mn ORIYA VOWEL SIGN I +0B40 ; Oriya # Mc ORIYA VOWEL SIGN II +0B41..0B44 ; Oriya # Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR +0B47..0B48 ; Oriya # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI +0B4B..0B4C ; Oriya # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU +0B4D ; Oriya # Mn ORIYA SIGN VIRAMA +0B55..0B56 ; Oriya # Mn [2] ORIYA SIGN OVERLINE..ORIYA AI LENGTH MARK +0B57 ; Oriya # Mc ORIYA AU LENGTH MARK +0B5C..0B5D ; Oriya # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA +0B5F..0B61 ; Oriya # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL +0B62..0B63 ; Oriya # Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL +0B66..0B6F ; Oriya # Nd [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE +0B70 ; Oriya # So ORIYA ISSHAR +0B71 ; Oriya # Lo ORIYA LETTER WA +0B72..0B77 ; Oriya # No [6] ORIYA FRACTION ONE QUARTER..ORIYA FRACTION THREE SIXTEENTHS + +# Total code points: 91 + +# ================================================ + +0B82 ; Tamil # Mn TAMIL SIGN ANUSVARA +0B83 ; Tamil # Lo TAMIL SIGN VISARGA +0B85..0B8A ; Tamil # Lo [6] TAMIL LETTER A..TAMIL LETTER UU +0B8E..0B90 ; Tamil # Lo [3] TAMIL LETTER E..TAMIL LETTER AI +0B92..0B95 ; Tamil # Lo [4] TAMIL LETTER O..TAMIL LETTER KA +0B99..0B9A ; Tamil # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA +0B9C ; Tamil # Lo TAMIL LETTER JA +0B9E..0B9F ; Tamil # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA +0BA3..0BA4 ; Tamil # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA +0BA8..0BAA ; Tamil # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA +0BAE..0BB9 ; Tamil # Lo [12] TAMIL LETTER MA..TAMIL LETTER HA +0BBE..0BBF ; Tamil # Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I +0BC0 ; Tamil # Mn TAMIL VOWEL SIGN II +0BC1..0BC2 ; Tamil # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU +0BC6..0BC8 ; Tamil # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI +0BCA..0BCC ; Tamil # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU +0BCD ; Tamil # Mn TAMIL SIGN VIRAMA +0BD0 ; Tamil # Lo TAMIL OM +0BD7 ; Tamil # Mc TAMIL AU LENGTH MARK +0BE6..0BEF ; Tamil # Nd [10] TAMIL DIGIT ZERO..TAMIL DIGIT NINE +0BF0..0BF2 ; Tamil # No [3] TAMIL NUMBER TEN..TAMIL NUMBER ONE THOUSAND +0BF3..0BF8 ; Tamil # So [6] TAMIL DAY SIGN..TAMIL AS ABOVE SIGN +0BF9 ; Tamil # Sc TAMIL RUPEE SIGN +0BFA ; Tamil # So TAMIL NUMBER SIGN +11FC0..11FD4 ; Tamil # No [21] TAMIL FRACTION ONE THREE-HUNDRED-AND-TWENTIETH..TAMIL FRACTION DOWNSCALING FACTOR KIIZH +11FD5..11FDC ; Tamil # So [8] TAMIL SIGN NEL..TAMIL SIGN MUKKURUNI +11FDD..11FE0 ; Tamil # Sc [4] TAMIL SIGN KAACU..TAMIL SIGN VARAAKAN +11FE1..11FF1 ; Tamil # So [17] TAMIL SIGN PAARAM..TAMIL SIGN VAKAIYARAA +11FFF ; Tamil # Po TAMIL PUNCTUATION END OF TEXT + +# Total code points: 123 + +# ================================================ + +0C00 ; Telugu # Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE +0C01..0C03 ; Telugu # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA +0C04 ; Telugu # Mn TELUGU SIGN COMBINING ANUSVARA ABOVE +0C05..0C0C ; Telugu # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L +0C0E..0C10 ; Telugu # Lo [3] TELUGU LETTER E..TELUGU LETTER AI +0C12..0C28 ; Telugu # Lo [23] TELUGU LETTER O..TELUGU LETTER NA +0C2A..0C39 ; Telugu # Lo [16] TELUGU LETTER PA..TELUGU LETTER HA +0C3C ; Telugu # Mn TELUGU SIGN NUKTA +0C3D ; Telugu # Lo TELUGU SIGN AVAGRAHA +0C3E..0C40 ; Telugu # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II +0C41..0C44 ; Telugu # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR +0C46..0C48 ; Telugu # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI +0C4A..0C4D ; Telugu # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA +0C55..0C56 ; Telugu # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK +0C58..0C5A ; Telugu # Lo [3] TELUGU LETTER TSA..TELUGU LETTER RRRA +0C5D ; Telugu # Lo TELUGU LETTER NAKAARA POLLU +0C60..0C61 ; Telugu # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL +0C62..0C63 ; Telugu # Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL +0C66..0C6F ; Telugu # Nd [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE +0C77 ; Telugu # Po TELUGU SIGN SIDDHAM +0C78..0C7E ; Telugu # No [7] TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR..TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR +0C7F ; Telugu # So TELUGU SIGN TUUMU + +# Total code points: 100 + +# ================================================ + +0C80 ; Kannada # Lo KANNADA SIGN SPACING CANDRABINDU +0C81 ; Kannada # Mn KANNADA SIGN CANDRABINDU +0C82..0C83 ; Kannada # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA +0C84 ; Kannada # Po KANNADA SIGN SIDDHAM +0C85..0C8C ; Kannada # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L +0C8E..0C90 ; Kannada # Lo [3] KANNADA LETTER E..KANNADA LETTER AI +0C92..0CA8 ; Kannada # Lo [23] KANNADA LETTER O..KANNADA LETTER NA +0CAA..0CB3 ; Kannada # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA +0CB5..0CB9 ; Kannada # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA +0CBC ; Kannada # Mn KANNADA SIGN NUKTA +0CBD ; Kannada # Lo KANNADA SIGN AVAGRAHA +0CBE ; Kannada # Mc KANNADA VOWEL SIGN AA +0CBF ; Kannada # Mn KANNADA VOWEL SIGN I +0CC0..0CC4 ; Kannada # Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR +0CC6 ; Kannada # Mn KANNADA VOWEL SIGN E +0CC7..0CC8 ; Kannada # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI +0CCA..0CCB ; Kannada # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO +0CCC..0CCD ; Kannada # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA +0CD5..0CD6 ; Kannada # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK +0CDD..0CDE ; Kannada # Lo [2] KANNADA LETTER NAKAARA POLLU..KANNADA LETTER FA +0CE0..0CE1 ; Kannada # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL +0CE2..0CE3 ; Kannada # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL +0CE6..0CEF ; Kannada # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE +0CF1..0CF2 ; Kannada # Lo [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA +0CF3 ; Kannada # Mc KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT + +# Total code points: 91 + +# ================================================ + +0D00..0D01 ; Malayalam # Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU +0D02..0D03 ; Malayalam # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA +0D04..0D0C ; Malayalam # Lo [9] MALAYALAM LETTER VEDIC ANUSVARA..MALAYALAM LETTER VOCALIC L +0D0E..0D10 ; Malayalam # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI +0D12..0D3A ; Malayalam # Lo [41] MALAYALAM LETTER O..MALAYALAM LETTER TTTA +0D3B..0D3C ; Malayalam # Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA +0D3D ; Malayalam # Lo MALAYALAM SIGN AVAGRAHA +0D3E..0D40 ; Malayalam # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II +0D41..0D44 ; Malayalam # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR +0D46..0D48 ; Malayalam # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI +0D4A..0D4C ; Malayalam # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU +0D4D ; Malayalam # Mn MALAYALAM SIGN VIRAMA +0D4E ; Malayalam # Lo MALAYALAM LETTER DOT REPH +0D4F ; Malayalam # So MALAYALAM SIGN PARA +0D54..0D56 ; Malayalam # Lo [3] MALAYALAM LETTER CHILLU M..MALAYALAM LETTER CHILLU LLL +0D57 ; Malayalam # Mc MALAYALAM AU LENGTH MARK +0D58..0D5E ; Malayalam # No [7] MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH..MALAYALAM FRACTION ONE FIFTH +0D5F..0D61 ; Malayalam # Lo [3] MALAYALAM LETTER ARCHAIC II..MALAYALAM LETTER VOCALIC LL +0D62..0D63 ; Malayalam # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL +0D66..0D6F ; Malayalam # Nd [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE +0D70..0D78 ; Malayalam # No [9] MALAYALAM NUMBER TEN..MALAYALAM FRACTION THREE SIXTEENTHS +0D79 ; Malayalam # So MALAYALAM DATE MARK +0D7A..0D7F ; Malayalam # Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K + +# Total code points: 118 + +# ================================================ + +0D81 ; Sinhala # Mn SINHALA SIGN CANDRABINDU +0D82..0D83 ; Sinhala # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA +0D85..0D96 ; Sinhala # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA +0D9A..0DB1 ; Sinhala # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA +0DB3..0DBB ; Sinhala # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA +0DBD ; Sinhala # Lo SINHALA LETTER DANTAJA LAYANNA +0DC0..0DC6 ; Sinhala # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA +0DCA ; Sinhala # Mn SINHALA SIGN AL-LAKUNA +0DCF..0DD1 ; Sinhala # Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA +0DD2..0DD4 ; Sinhala # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA +0DD6 ; Sinhala # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA +0DD8..0DDF ; Sinhala # Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA +0DE6..0DEF ; Sinhala # Nd [10] SINHALA LITH DIGIT ZERO..SINHALA LITH DIGIT NINE +0DF2..0DF3 ; Sinhala # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA +0DF4 ; Sinhala # Po SINHALA PUNCTUATION KUNDDALIYA +111E1..111F4 ; Sinhala # No [20] SINHALA ARCHAIC DIGIT ONE..SINHALA ARCHAIC NUMBER ONE THOUSAND + +# Total code points: 111 + +# ================================================ + +0E01..0E30 ; Thai # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A +0E31 ; Thai # Mn THAI CHARACTER MAI HAN-AKAT +0E32..0E33 ; Thai # Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM +0E34..0E3A ; Thai # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU +0E40..0E45 ; Thai # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO +0E46 ; Thai # Lm THAI CHARACTER MAIYAMOK +0E47..0E4E ; Thai # Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN +0E4F ; Thai # Po THAI CHARACTER FONGMAN +0E50..0E59 ; Thai # Nd [10] THAI DIGIT ZERO..THAI DIGIT NINE +0E5A..0E5B ; Thai # Po [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT + +# Total code points: 86 + +# ================================================ + +0E81..0E82 ; Lao # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG +0E84 ; Lao # Lo LAO LETTER KHO TAM +0E86..0E8A ; Lao # Lo [5] LAO LETTER PALI GHA..LAO LETTER SO TAM +0E8C..0EA3 ; Lao # Lo [24] LAO LETTER PALI JHA..LAO LETTER LO LING +0EA5 ; Lao # Lo LAO LETTER LO LOOT +0EA7..0EB0 ; Lao # Lo [10] LAO LETTER WO..LAO VOWEL SIGN A +0EB1 ; Lao # Mn LAO VOWEL SIGN MAI KAN +0EB2..0EB3 ; Lao # Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM +0EB4..0EBC ; Lao # Mn [9] LAO VOWEL SIGN I..LAO SEMIVOWEL SIGN LO +0EBD ; Lao # Lo LAO SEMIVOWEL SIGN NYO +0EC0..0EC4 ; Lao # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI +0EC6 ; Lao # Lm LAO KO LA +0EC8..0ECE ; Lao # Mn [7] LAO TONE MAI EK..LAO YAMAKKAN +0ED0..0ED9 ; Lao # Nd [10] LAO DIGIT ZERO..LAO DIGIT NINE +0EDC..0EDF ; Lao # Lo [4] LAO HO NO..LAO LETTER KHMU NYO + +# Total code points: 83 + +# ================================================ + +0F00 ; Tibetan # Lo TIBETAN SYLLABLE OM +0F01..0F03 ; Tibetan # So [3] TIBETAN MARK GTER YIG MGO TRUNCATED A..TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA +0F04..0F12 ; Tibetan # Po [15] TIBETAN MARK INITIAL YIG MGO MDUN MA..TIBETAN MARK RGYA GRAM SHAD +0F13 ; Tibetan # So TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN +0F14 ; Tibetan # Po TIBETAN MARK GTER TSHEG +0F15..0F17 ; Tibetan # So [3] TIBETAN LOGOTYPE SIGN CHAD RTAGS..TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS +0F18..0F19 ; Tibetan # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS +0F1A..0F1F ; Tibetan # So [6] TIBETAN SIGN RDEL DKAR GCIG..TIBETAN SIGN RDEL DKAR RDEL NAG +0F20..0F29 ; Tibetan # Nd [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE +0F2A..0F33 ; Tibetan # No [10] TIBETAN DIGIT HALF ONE..TIBETAN DIGIT HALF ZERO +0F34 ; Tibetan # So TIBETAN MARK BSDUS RTAGS +0F35 ; Tibetan # Mn TIBETAN MARK NGAS BZUNG NYI ZLA +0F36 ; Tibetan # So TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN +0F37 ; Tibetan # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS +0F38 ; Tibetan # So TIBETAN MARK CHE MGO +0F39 ; Tibetan # Mn TIBETAN MARK TSA -PHRU +0F3A ; Tibetan # Ps TIBETAN MARK GUG RTAGS GYON +0F3B ; Tibetan # Pe TIBETAN MARK GUG RTAGS GYAS +0F3C ; Tibetan # Ps TIBETAN MARK ANG KHANG GYON +0F3D ; Tibetan # Pe TIBETAN MARK ANG KHANG GYAS +0F3E..0F3F ; Tibetan # Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES +0F40..0F47 ; Tibetan # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA +0F49..0F6C ; Tibetan # Lo [36] TIBETAN LETTER NYA..TIBETAN LETTER RRA +0F71..0F7E ; Tibetan # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO +0F7F ; Tibetan # Mc TIBETAN SIGN RNAM BCAD +0F80..0F84 ; Tibetan # Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA +0F85 ; Tibetan # Po TIBETAN MARK PALUTA +0F86..0F87 ; Tibetan # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS +0F88..0F8C ; Tibetan # Lo [5] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN INVERTED MCHU CAN +0F8D..0F97 ; Tibetan # Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA +0F99..0FBC ; Tibetan # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA +0FBE..0FC5 ; Tibetan # So [8] TIBETAN KU RU KHA..TIBETAN SYMBOL RDO RJE +0FC6 ; Tibetan # Mn TIBETAN SYMBOL PADMA GDAN +0FC7..0FCC ; Tibetan # So [6] TIBETAN SYMBOL RDO RJE RGYA GRAM..TIBETAN SYMBOL NOR BU BZHI -KHYIL +0FCE..0FCF ; Tibetan # So [2] TIBETAN SIGN RDEL NAG RDEL DKAR..TIBETAN SIGN RDEL NAG GSUM +0FD0..0FD4 ; Tibetan # Po [5] TIBETAN MARK BSKA- SHOG GI MGO RGYAN..TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA +0FD9..0FDA ; Tibetan # Po [2] TIBETAN MARK LEADING MCHAN RTAGS..TIBETAN MARK TRAILING MCHAN RTAGS + +# Total code points: 207 + +# ================================================ + +1000..102A ; Myanmar # Lo [43] MYANMAR LETTER KA..MYANMAR LETTER AU +102B..102C ; Myanmar # Mc [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA +102D..1030 ; Myanmar # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU +1031 ; Myanmar # Mc MYANMAR VOWEL SIGN E +1032..1037 ; Myanmar # Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW +1038 ; Myanmar # Mc MYANMAR SIGN VISARGA +1039..103A ; Myanmar # Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT +103B..103C ; Myanmar # Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA +103D..103E ; Myanmar # Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA +103F ; Myanmar # Lo MYANMAR LETTER GREAT SA +1040..1049 ; Myanmar # Nd [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE +104A..104F ; Myanmar # Po [6] MYANMAR SIGN LITTLE SECTION..MYANMAR SYMBOL GENITIVE +1050..1055 ; Myanmar # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL +1056..1057 ; Myanmar # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR +1058..1059 ; Myanmar # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL +105A..105D ; Myanmar # Lo [4] MYANMAR LETTER MON NGA..MYANMAR LETTER MON BBE +105E..1060 ; Myanmar # Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA +1061 ; Myanmar # Lo MYANMAR LETTER SGAW KAREN SHA +1062..1064 ; Myanmar # Mc [3] MYANMAR VOWEL SIGN SGAW KAREN EU..MYANMAR TONE MARK SGAW KAREN KE PHO +1065..1066 ; Myanmar # Lo [2] MYANMAR LETTER WESTERN PWO KAREN THA..MYANMAR LETTER WESTERN PWO KAREN PWA +1067..106D ; Myanmar # Mc [7] MYANMAR VOWEL SIGN WESTERN PWO KAREN EU..MYANMAR SIGN WESTERN PWO KAREN TONE-5 +106E..1070 ; Myanmar # Lo [3] MYANMAR LETTER EASTERN PWO KAREN NNA..MYANMAR LETTER EASTERN PWO KAREN GHWA +1071..1074 ; Myanmar # Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE +1075..1081 ; Myanmar # Lo [13] MYANMAR LETTER SHAN KA..MYANMAR LETTER SHAN HA +1082 ; Myanmar # Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA +1083..1084 ; Myanmar # Mc [2] MYANMAR VOWEL SIGN SHAN AA..MYANMAR VOWEL SIGN SHAN E +1085..1086 ; Myanmar # Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y +1087..108C ; Myanmar # Mc [6] MYANMAR SIGN SHAN TONE-2..MYANMAR SIGN SHAN COUNCIL TONE-3 +108D ; Myanmar # Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE +108E ; Myanmar # Lo MYANMAR LETTER RUMAI PALAUNG FA +108F ; Myanmar # Mc MYANMAR SIGN RUMAI PALAUNG TONE-5 +1090..1099 ; Myanmar # Nd [10] MYANMAR SHAN DIGIT ZERO..MYANMAR SHAN DIGIT NINE +109A..109C ; Myanmar # Mc [3] MYANMAR SIGN KHAMTI TONE-1..MYANMAR VOWEL SIGN AITON A +109D ; Myanmar # Mn MYANMAR VOWEL SIGN AITON AI +109E..109F ; Myanmar # So [2] MYANMAR SYMBOL SHAN ONE..MYANMAR SYMBOL SHAN EXCLAMATION +A9E0..A9E4 ; Myanmar # Lo [5] MYANMAR LETTER SHAN GHA..MYANMAR LETTER SHAN BHA +A9E5 ; Myanmar # Mn MYANMAR SIGN SHAN SAW +A9E6 ; Myanmar # Lm MYANMAR MODIFIER LETTER SHAN REDUPLICATION +A9E7..A9EF ; Myanmar # Lo [9] MYANMAR LETTER TAI LAING NYA..MYANMAR LETTER TAI LAING NNA +A9F0..A9F9 ; Myanmar # Nd [10] MYANMAR TAI LAING DIGIT ZERO..MYANMAR TAI LAING DIGIT NINE +A9FA..A9FE ; Myanmar # Lo [5] MYANMAR LETTER TAI LAING LLA..MYANMAR LETTER TAI LAING BHA +AA60..AA6F ; Myanmar # Lo [16] MYANMAR LETTER KHAMTI GA..MYANMAR LETTER KHAMTI FA +AA70 ; Myanmar # Lm MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION +AA71..AA76 ; Myanmar # Lo [6] MYANMAR LETTER KHAMTI XA..MYANMAR LOGOGRAM KHAMTI HM +AA77..AA79 ; Myanmar # So [3] MYANMAR SYMBOL AITON EXCLAMATION..MYANMAR SYMBOL AITON TWO +AA7A ; Myanmar # Lo MYANMAR LETTER AITON RA +AA7B ; Myanmar # Mc MYANMAR SIGN PAO KAREN TONE +AA7C ; Myanmar # Mn MYANMAR SIGN TAI LAING TONE-2 +AA7D ; Myanmar # Mc MYANMAR SIGN TAI LAING TONE-5 +AA7E..AA7F ; Myanmar # Lo [2] MYANMAR LETTER SHWE PALAUNG CHA..MYANMAR LETTER SHWE PALAUNG SHA + +# Total code points: 223 + +# ================================================ + +10A0..10C5 ; Georgian # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE +10C7 ; Georgian # L& GEORGIAN CAPITAL LETTER YN +10CD ; Georgian # L& GEORGIAN CAPITAL LETTER AEN +10D0..10FA ; Georgian # L& [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN +10FC ; Georgian # Lm MODIFIER LETTER GEORGIAN NAR +10FD..10FF ; Georgian # L& [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN +1C90..1CBA ; Georgian # L& [43] GEORGIAN MTAVRULI CAPITAL LETTER AN..GEORGIAN MTAVRULI CAPITAL LETTER AIN +1CBD..1CBF ; Georgian # L& [3] GEORGIAN MTAVRULI CAPITAL LETTER AEN..GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN +2D00..2D25 ; Georgian # L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE +2D27 ; Georgian # L& GEORGIAN SMALL LETTER YN +2D2D ; Georgian # L& GEORGIAN SMALL LETTER AEN + +# Total code points: 173 + +# ================================================ + +1100..11FF ; Hangul # Lo [256] HANGUL CHOSEONG KIYEOK..HANGUL JONGSEONG SSANGNIEUN +302E..302F ; Hangul # Mc [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK +3131..318E ; Hangul # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE +3200..321E ; Hangul # So [31] PARENTHESIZED HANGUL KIYEOK..PARENTHESIZED KOREAN CHARACTER O HU +3260..327E ; Hangul # So [31] CIRCLED HANGUL KIYEOK..CIRCLED HANGUL IEUNG U +A960..A97C ; Hangul # Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH +AC00..D7A3 ; Hangul # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH +D7B0..D7C6 ; Hangul # Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E +D7CB..D7FB ; Hangul # Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH +FFA0..FFBE ; Hangul # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH +FFC2..FFC7 ; Hangul # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E +FFCA..FFCF ; Hangul # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE +FFD2..FFD7 ; Hangul # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU +FFDA..FFDC ; Hangul # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I + +# Total code points: 11739 + +# ================================================ + +1200..1248 ; Ethiopic # Lo [73] ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE QWA +124A..124D ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE +1250..1256 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO +1258 ; Ethiopic # Lo ETHIOPIC SYLLABLE QHWA +125A..125D ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE +1260..1288 ; Ethiopic # Lo [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA +128A..128D ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE +1290..12B0 ; Ethiopic # Lo [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA +12B2..12B5 ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE +12B8..12BE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO +12C0 ; Ethiopic # Lo ETHIOPIC SYLLABLE KXWA +12C2..12C5 ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE +12C8..12D6 ; Ethiopic # Lo [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O +12D8..1310 ; Ethiopic # Lo [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA +1312..1315 ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE +1318..135A ; Ethiopic # Lo [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA +135D..135F ; Ethiopic # Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK +1360..1368 ; Ethiopic # Po [9] ETHIOPIC SECTION MARK..ETHIOPIC PARAGRAPH SEPARATOR +1369..137C ; Ethiopic # No [20] ETHIOPIC DIGIT ONE..ETHIOPIC NUMBER TEN THOUSAND +1380..138F ; Ethiopic # Lo [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE +1390..1399 ; Ethiopic # So [10] ETHIOPIC TONAL MARK YIZET..ETHIOPIC TONAL MARK KURT +2D80..2D96 ; Ethiopic # Lo [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE +2DA0..2DA6 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO +2DA8..2DAE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO +2DB0..2DB6 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO +2DB8..2DBE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO +2DC0..2DC6 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO +2DC8..2DCE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO +2DD0..2DD6 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO +2DD8..2DDE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO +AB01..AB06 ; Ethiopic # Lo [6] ETHIOPIC SYLLABLE TTHU..ETHIOPIC SYLLABLE TTHO +AB09..AB0E ; Ethiopic # Lo [6] ETHIOPIC SYLLABLE DDHU..ETHIOPIC SYLLABLE DDHO +AB11..AB16 ; Ethiopic # Lo [6] ETHIOPIC SYLLABLE DZU..ETHIOPIC SYLLABLE DZO +AB20..AB26 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE CCHHA..ETHIOPIC SYLLABLE CCHHO +AB28..AB2E ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE BBA..ETHIOPIC SYLLABLE BBO +1E7E0..1E7E6 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO +1E7E8..1E7EB ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE +1E7ED..1E7EE ; Ethiopic # Lo [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE +1E7F0..1E7FE ; Ethiopic # Lo [15] ETHIOPIC SYLLABLE GURAGE QWI..ETHIOPIC SYLLABLE GURAGE PWEE + +# Total code points: 523 + +# ================================================ + +13A0..13F5 ; Cherokee # L& [86] CHEROKEE LETTER A..CHEROKEE LETTER MV +13F8..13FD ; Cherokee # L& [6] CHEROKEE SMALL LETTER YE..CHEROKEE SMALL LETTER MV +AB70..ABBF ; Cherokee # L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA + +# Total code points: 172 + +# ================================================ + +1400 ; Canadian_Aboriginal # Pd CANADIAN SYLLABICS HYPHEN +1401..166C ; Canadian_Aboriginal # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA +166D ; Canadian_Aboriginal # So CANADIAN SYLLABICS CHI SIGN +166E ; Canadian_Aboriginal # Po CANADIAN SYLLABICS FULL STOP +166F..167F ; Canadian_Aboriginal # Lo [17] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS BLACKFOOT W +18B0..18F5 ; Canadian_Aboriginal # Lo [70] CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S +11AB0..11ABF ; Canadian_Aboriginal # Lo [16] CANADIAN SYLLABICS NATTILIK HI..CANADIAN SYLLABICS SPA + +# Total code points: 726 + +# ================================================ + +1680 ; Ogham # Zs OGHAM SPACE MARK +1681..169A ; Ogham # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH +169B ; Ogham # Ps OGHAM FEATHER MARK +169C ; Ogham # Pe OGHAM REVERSED FEATHER MARK + +# Total code points: 29 + +# ================================================ + +16A0..16EA ; Runic # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X +16EE..16F0 ; Runic # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL +16F1..16F8 ; Runic # Lo [8] RUNIC LETTER K..RUNIC LETTER FRANKS CASKET AESC + +# Total code points: 86 + +# ================================================ + +1780..17B3 ; Khmer # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU +17B4..17B5 ; Khmer # Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA +17B6 ; Khmer # Mc KHMER VOWEL SIGN AA +17B7..17BD ; Khmer # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA +17BE..17C5 ; Khmer # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU +17C6 ; Khmer # Mn KHMER SIGN NIKAHIT +17C7..17C8 ; Khmer # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU +17C9..17D3 ; Khmer # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT +17D4..17D6 ; Khmer # Po [3] KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH +17D7 ; Khmer # Lm KHMER SIGN LEK TOO +17D8..17DA ; Khmer # Po [3] KHMER SIGN BEYYAL..KHMER SIGN KOOMUUT +17DB ; Khmer # Sc KHMER CURRENCY SYMBOL RIEL +17DC ; Khmer # Lo KHMER SIGN AVAKRAHASANYA +17DD ; Khmer # Mn KHMER SIGN ATTHACAN +17E0..17E9 ; Khmer # Nd [10] KHMER DIGIT ZERO..KHMER DIGIT NINE +17F0..17F9 ; Khmer # No [10] KHMER SYMBOL LEK ATTAK SON..KHMER SYMBOL LEK ATTAK PRAM-BUON +19E0..19FF ; Khmer # So [32] KHMER SYMBOL PATHAMASAT..KHMER SYMBOL DAP-PRAM ROC + +# Total code points: 146 + +# ================================================ + +1800..1801 ; Mongolian # Po [2] MONGOLIAN BIRGA..MONGOLIAN ELLIPSIS +1804 ; Mongolian # Po MONGOLIAN COLON +1806 ; Mongolian # Pd MONGOLIAN TODO SOFT HYPHEN +1807..180A ; Mongolian # Po [4] MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER..MONGOLIAN NIRUGU +180B..180D ; Mongolian # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE +180E ; Mongolian # Cf MONGOLIAN VOWEL SEPARATOR +180F ; Mongolian # Mn MONGOLIAN FREE VARIATION SELECTOR FOUR +1810..1819 ; Mongolian # Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE +1820..1842 ; Mongolian # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI +1843 ; Mongolian # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN +1844..1878 ; Mongolian # Lo [53] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER CHA WITH TWO DOTS +1880..1884 ; Mongolian # Lo [5] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER ALI GALI INVERTED UBADAMA +1885..1886 ; Mongolian # Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA +1887..18A8 ; Mongolian # Lo [34] MONGOLIAN LETTER ALI GALI A..MONGOLIAN LETTER MANCHU ALI GALI BHA +18A9 ; Mongolian # Mn MONGOLIAN LETTER ALI GALI DAGALGA +18AA ; Mongolian # Lo MONGOLIAN LETTER MANCHU ALI GALI LHA +11660..1166C ; Mongolian # Po [13] MONGOLIAN BIRGA WITH ORNAMENT..MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT + +# Total code points: 168 + +# ================================================ + +3041..3096 ; Hiragana # Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE +309D..309E ; Hiragana # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK +309F ; Hiragana # Lo HIRAGANA DIGRAPH YORI +1B001..1B11F ; Hiragana # Lo [287] HIRAGANA LETTER ARCHAIC YE..HIRAGANA LETTER ARCHAIC WU +1B132 ; Hiragana # Lo HIRAGANA LETTER SMALL KO +1B150..1B152 ; Hiragana # Lo [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO +1F200 ; Hiragana # So SQUARE HIRAGANA HOKA + +# Total code points: 381 + +# ================================================ + +30A1..30FA ; Katakana # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO +30FD..30FE ; Katakana # Lm [2] KATAKANA ITERATION MARK..KATAKANA VOICED ITERATION MARK +30FF ; Katakana # Lo KATAKANA DIGRAPH KOTO +31F0..31FF ; Katakana # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO +32D0..32FE ; Katakana # So [47] CIRCLED KATAKANA A..CIRCLED KATAKANA WO +3300..3357 ; Katakana # So [88] SQUARE APAATO..SQUARE WATTO +FF66..FF6F ; Katakana # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU +FF71..FF9D ; Katakana # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N +1AFF0..1AFF3 ; Katakana # Lm [4] KATAKANA LETTER MINNAN TONE-2..KATAKANA LETTER MINNAN TONE-5 +1AFF5..1AFFB ; Katakana # Lm [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5 +1AFFD..1AFFE ; Katakana # Lm [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8 +1B000 ; Katakana # Lo KATAKANA LETTER ARCHAIC E +1B120..1B122 ; Katakana # Lo [3] KATAKANA LETTER ARCHAIC YI..KATAKANA LETTER ARCHAIC WU +1B155 ; Katakana # Lo KATAKANA LETTER SMALL KO +1B164..1B167 ; Katakana # Lo [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N + +# Total code points: 321 + +# ================================================ + +02EA..02EB ; Bopomofo # Sk [2] MODIFIER LETTER YIN DEPARTING TONE MARK..MODIFIER LETTER YANG DEPARTING TONE MARK +3105..312F ; Bopomofo # Lo [43] BOPOMOFO LETTER B..BOPOMOFO LETTER NN +31A0..31BF ; Bopomofo # Lo [32] BOPOMOFO LETTER BU..BOPOMOFO LETTER AH + +# Total code points: 77 + +# ================================================ + +2E80..2E99 ; Han # So [26] CJK RADICAL REPEAT..CJK RADICAL RAP +2E9B..2EF3 ; Han # So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE +2F00..2FD5 ; Han # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE +3005 ; Han # Lm IDEOGRAPHIC ITERATION MARK +3007 ; Han # Nl IDEOGRAPHIC NUMBER ZERO +3021..3029 ; Han # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE +3038..303A ; Han # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY +303B ; Han # Lm VERTICAL IDEOGRAPHIC ITERATION MARK +3400..4DBF ; Han # Lo [6592] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DBF +4E00..9FFF ; Han # Lo [20992] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FFF +F900..FA6D ; Han # Lo [366] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA6D +FA70..FAD9 ; Han # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9 +16FE2 ; Han # Po OLD CHINESE HOOK MARK +16FE3 ; Han # Lm OLD CHINESE ITERATION MARK +16FF0..16FF1 ; Han # Mc [2] VIETNAMESE ALTERNATE READING MARK CA..VIETNAMESE ALTERNATE READING MARK NHAY +20000..2A6DF ; Han # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF +2A700..2B739 ; Han # Lo [4154] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B739 +2B740..2B81D ; Han # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D +2B820..2CEA1 ; Han # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 +2CEB0..2EBE0 ; Han # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 +2EBF0..2EE5D ; Han # Lo [622] CJK UNIFIED IDEOGRAPH-2EBF0..CJK UNIFIED IDEOGRAPH-2EE5D +2F800..2FA1D ; Han # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D +30000..3134A ; Han # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A +31350..323AF ; Han # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF + +# Total code points: 99030 + +# ================================================ + +A000..A014 ; Yi # Lo [21] YI SYLLABLE IT..YI SYLLABLE E +A015 ; Yi # Lm YI SYLLABLE WU +A016..A48C ; Yi # Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR +A490..A4C6 ; Yi # So [55] YI RADICAL QOT..YI RADICAL KE + +# Total code points: 1220 + +# ================================================ + +10300..1031F ; Old_Italic # Lo [32] OLD ITALIC LETTER A..OLD ITALIC LETTER ESS +10320..10323 ; Old_Italic # No [4] OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY +1032D..1032F ; Old_Italic # Lo [3] OLD ITALIC LETTER YE..OLD ITALIC LETTER SOUTHERN TSE + +# Total code points: 39 + +# ================================================ + +10330..10340 ; Gothic # Lo [17] GOTHIC LETTER AHSA..GOTHIC LETTER PAIRTHRA +10341 ; Gothic # Nl GOTHIC LETTER NINETY +10342..10349 ; Gothic # Lo [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL +1034A ; Gothic # Nl GOTHIC LETTER NINE HUNDRED + +# Total code points: 27 + +# ================================================ + +10400..1044F ; Deseret # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW + +# Total code points: 80 + +# ================================================ + +0300..036F ; Inherited # Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X +0485..0486 ; Inherited # Mn [2] COMBINING CYRILLIC DASIA PNEUMATA..COMBINING CYRILLIC PSILI PNEUMATA +064B..0655 ; Inherited # Mn [11] ARABIC FATHATAN..ARABIC HAMZA BELOW +0670 ; Inherited # Mn ARABIC LETTER SUPERSCRIPT ALEF +0951..0954 ; Inherited # Mn [4] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI ACUTE ACCENT +1AB0..1ABD ; Inherited # Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW +1ABE ; Inherited # Me COMBINING PARENTHESES OVERLAY +1ABF..1ACE ; Inherited # Mn [16] COMBINING LATIN SMALL LETTER W BELOW..COMBINING LATIN SMALL LETTER INSULAR T +1CD0..1CD2 ; Inherited # Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA +1CD4..1CE0 ; Inherited # Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA +1CE2..1CE8 ; Inherited # Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL +1CED ; Inherited # Mn VEDIC SIGN TIRYAK +1CF4 ; Inherited # Mn VEDIC TONE CANDRA ABOVE +1CF8..1CF9 ; Inherited # Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE +1DC0..1DFF ; Inherited # Mn [64] COMBINING DOTTED GRAVE ACCENT..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW +200C..200D ; Inherited # Cf [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER +20D0..20DC ; Inherited # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE +20DD..20E0 ; Inherited # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH +20E1 ; Inherited # Mn COMBINING LEFT RIGHT ARROW ABOVE +20E2..20E4 ; Inherited # Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE +20E5..20F0 ; Inherited # Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE +302A..302D ; Inherited # Mn [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK +3099..309A ; Inherited # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +FE00..FE0F ; Inherited # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 +FE20..FE2D ; Inherited # Mn [14] COMBINING LIGATURE LEFT HALF..COMBINING CONJOINING MACRON BELOW +101FD ; Inherited # Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE +102E0 ; Inherited # Mn COPTIC EPACT THOUSANDS MARK +1133B ; Inherited # Mn COMBINING BINDU BELOW +1CF00..1CF2D ; Inherited # Mn [46] ZNAMENNY COMBINING MARK GORAZDO NIZKO S KRYZHEM ON LEFT..ZNAMENNY COMBINING MARK KRYZH ON LEFT +1CF30..1CF46 ; Inherited # Mn [23] ZNAMENNY COMBINING TONAL RANGE MARK MRACHNO..ZNAMENNY PRIZNAK MODIFIER ROG +1D167..1D169 ; Inherited # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 +1D17B..1D182 ; Inherited # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE +1D185..1D18B ; Inherited # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE +1D1AA..1D1AD ; Inherited # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO +E0100..E01EF ; Inherited # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 + +# Total code points: 657 + +# ================================================ + +1700..1711 ; Tagalog # Lo [18] TAGALOG LETTER A..TAGALOG LETTER HA +1712..1714 ; Tagalog # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA +1715 ; Tagalog # Mc TAGALOG SIGN PAMUDPOD +171F ; Tagalog # Lo TAGALOG LETTER ARCHAIC RA + +# Total code points: 23 + +# ================================================ + +1720..1731 ; Hanunoo # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA +1732..1733 ; Hanunoo # Mn [2] HANUNOO VOWEL SIGN I..HANUNOO VOWEL SIGN U +1734 ; Hanunoo # Mc HANUNOO SIGN PAMUDPOD + +# Total code points: 21 + +# ================================================ + +1740..1751 ; Buhid # Lo [18] BUHID LETTER A..BUHID LETTER HA +1752..1753 ; Buhid # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U + +# Total code points: 20 + +# ================================================ + +1760..176C ; Tagbanwa # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA +176E..1770 ; Tagbanwa # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA +1772..1773 ; Tagbanwa # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U + +# Total code points: 18 + +# ================================================ + +1900..191E ; Limbu # Lo [31] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER TRA +1920..1922 ; Limbu # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U +1923..1926 ; Limbu # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU +1927..1928 ; Limbu # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O +1929..192B ; Limbu # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA +1930..1931 ; Limbu # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA +1932 ; Limbu # Mn LIMBU SMALL LETTER ANUSVARA +1933..1938 ; Limbu # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA +1939..193B ; Limbu # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I +1940 ; Limbu # So LIMBU SIGN LOO +1944..1945 ; Limbu # Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK +1946..194F ; Limbu # Nd [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE + +# Total code points: 68 + +# ================================================ + +1950..196D ; Tai_Le # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI +1970..1974 ; Tai_Le # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 + +# Total code points: 35 + +# ================================================ + +10000..1000B ; Linear_B # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE +1000D..10026 ; Linear_B # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO +10028..1003A ; Linear_B # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO +1003C..1003D ; Linear_B # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE +1003F..1004D ; Linear_B # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO +10050..1005D ; Linear_B # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 +10080..100FA ; Linear_B # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 + +# Total code points: 211 + +# ================================================ + +10380..1039D ; Ugaritic # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU +1039F ; Ugaritic # Po UGARITIC WORD DIVIDER + +# Total code points: 31 + +# ================================================ + +10450..1047F ; Shavian # Lo [48] SHAVIAN LETTER PEEP..SHAVIAN LETTER YEW + +# Total code points: 48 + +# ================================================ + +10480..1049D ; Osmanya # Lo [30] OSMANYA LETTER ALEF..OSMANYA LETTER OO +104A0..104A9 ; Osmanya # Nd [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE + +# Total code points: 40 + +# ================================================ + +10800..10805 ; Cypriot # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA +10808 ; Cypriot # Lo CYPRIOT SYLLABLE JO +1080A..10835 ; Cypriot # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO +10837..10838 ; Cypriot # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE +1083C ; Cypriot # Lo CYPRIOT SYLLABLE ZA +1083F ; Cypriot # Lo CYPRIOT SYLLABLE ZO + +# Total code points: 55 + +# ================================================ + +2800..28FF ; Braille # So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678 + +# Total code points: 256 + +# ================================================ + +1A00..1A16 ; Buginese # Lo [23] BUGINESE LETTER KA..BUGINESE LETTER HA +1A17..1A18 ; Buginese # Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U +1A19..1A1A ; Buginese # Mc [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O +1A1B ; Buginese # Mn BUGINESE VOWEL SIGN AE +1A1E..1A1F ; Buginese # Po [2] BUGINESE PALLAWA..BUGINESE END OF SECTION + +# Total code points: 30 + +# ================================================ + +03E2..03EF ; Coptic # L& [14] COPTIC CAPITAL LETTER SHEI..COPTIC SMALL LETTER DEI +2C80..2CE4 ; Coptic # L& [101] COPTIC CAPITAL LETTER ALFA..COPTIC SYMBOL KAI +2CE5..2CEA ; Coptic # So [6] COPTIC SYMBOL MI RO..COPTIC SYMBOL SHIMA SIMA +2CEB..2CEE ; Coptic # L& [4] COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI..COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA +2CEF..2CF1 ; Coptic # Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS +2CF2..2CF3 ; Coptic # L& [2] COPTIC CAPITAL LETTER BOHAIRIC KHEI..COPTIC SMALL LETTER BOHAIRIC KHEI +2CF9..2CFC ; Coptic # Po [4] COPTIC OLD NUBIAN FULL STOP..COPTIC OLD NUBIAN VERSE DIVIDER +2CFD ; Coptic # No COPTIC FRACTION ONE HALF +2CFE..2CFF ; Coptic # Po [2] COPTIC FULL STOP..COPTIC MORPHOLOGICAL DIVIDER + +# Total code points: 137 + +# ================================================ + +1980..19AB ; New_Tai_Lue # Lo [44] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW SUA +19B0..19C9 ; New_Tai_Lue # Lo [26] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE TONE MARK-2 +19D0..19D9 ; New_Tai_Lue # Nd [10] NEW TAI LUE DIGIT ZERO..NEW TAI LUE DIGIT NINE +19DA ; New_Tai_Lue # No NEW TAI LUE THAM DIGIT ONE +19DE..19DF ; New_Tai_Lue # So [2] NEW TAI LUE SIGN LAE..NEW TAI LUE SIGN LAEV + +# Total code points: 83 + +# ================================================ + +2C00..2C5F ; Glagolitic # L& [96] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC SMALL LETTER CAUDATE CHRIVI +1E000..1E006 ; Glagolitic # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE +1E008..1E018 ; Glagolitic # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU +1E01B..1E021 ; Glagolitic # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI +1E023..1E024 ; Glagolitic # Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS +1E026..1E02A ; Glagolitic # Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA + +# Total code points: 134 + +# ================================================ + +2D30..2D67 ; Tifinagh # Lo [56] TIFINAGH LETTER YA..TIFINAGH LETTER YO +2D6F ; Tifinagh # Lm TIFINAGH MODIFIER LETTER LABIALIZATION MARK +2D70 ; Tifinagh # Po TIFINAGH SEPARATOR MARK +2D7F ; Tifinagh # Mn TIFINAGH CONSONANT JOINER + +# Total code points: 59 + +# ================================================ + +A800..A801 ; Syloti_Nagri # Lo [2] SYLOTI NAGRI LETTER A..SYLOTI NAGRI LETTER I +A802 ; Syloti_Nagri # Mn SYLOTI NAGRI SIGN DVISVARA +A803..A805 ; Syloti_Nagri # Lo [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O +A806 ; Syloti_Nagri # Mn SYLOTI NAGRI SIGN HASANTA +A807..A80A ; Syloti_Nagri # Lo [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO +A80B ; Syloti_Nagri # Mn SYLOTI NAGRI SIGN ANUSVARA +A80C..A822 ; Syloti_Nagri # Lo [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO +A823..A824 ; Syloti_Nagri # Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I +A825..A826 ; Syloti_Nagri # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E +A827 ; Syloti_Nagri # Mc SYLOTI NAGRI VOWEL SIGN OO +A828..A82B ; Syloti_Nagri # So [4] SYLOTI NAGRI POETRY MARK-1..SYLOTI NAGRI POETRY MARK-4 +A82C ; Syloti_Nagri # Mn SYLOTI NAGRI SIGN ALTERNATE HASANTA + +# Total code points: 45 + +# ================================================ + +103A0..103C3 ; Old_Persian # Lo [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA +103C8..103CF ; Old_Persian # Lo [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH +103D0 ; Old_Persian # Po OLD PERSIAN WORD DIVIDER +103D1..103D5 ; Old_Persian # Nl [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED + +# Total code points: 50 + +# ================================================ + +10A00 ; Kharoshthi # Lo KHAROSHTHI LETTER A +10A01..10A03 ; Kharoshthi # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R +10A05..10A06 ; Kharoshthi # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O +10A0C..10A0F ; Kharoshthi # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA +10A10..10A13 ; Kharoshthi # Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA +10A15..10A17 ; Kharoshthi # Lo [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA +10A19..10A35 ; Kharoshthi # Lo [29] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER VHA +10A38..10A3A ; Kharoshthi # Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW +10A3F ; Kharoshthi # Mn KHAROSHTHI VIRAMA +10A40..10A48 ; Kharoshthi # No [9] KHAROSHTHI DIGIT ONE..KHAROSHTHI FRACTION ONE HALF +10A50..10A58 ; Kharoshthi # Po [9] KHAROSHTHI PUNCTUATION DOT..KHAROSHTHI PUNCTUATION LINES + +# Total code points: 68 + +# ================================================ + +1B00..1B03 ; Balinese # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG +1B04 ; Balinese # Mc BALINESE SIGN BISAH +1B05..1B33 ; Balinese # Lo [47] BALINESE LETTER AKARA..BALINESE LETTER HA +1B34 ; Balinese # Mn BALINESE SIGN REREKAN +1B35 ; Balinese # Mc BALINESE VOWEL SIGN TEDUNG +1B36..1B3A ; Balinese # Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA +1B3B ; Balinese # Mc BALINESE VOWEL SIGN RA REPA TEDUNG +1B3C ; Balinese # Mn BALINESE VOWEL SIGN LA LENGA +1B3D..1B41 ; Balinese # Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG +1B42 ; Balinese # Mn BALINESE VOWEL SIGN PEPET +1B43..1B44 ; Balinese # Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG +1B45..1B4C ; Balinese # Lo [8] BALINESE LETTER KAF SASAK..BALINESE LETTER ARCHAIC JNYA +1B50..1B59 ; Balinese # Nd [10] BALINESE DIGIT ZERO..BALINESE DIGIT NINE +1B5A..1B60 ; Balinese # Po [7] BALINESE PANTI..BALINESE PAMENENG +1B61..1B6A ; Balinese # So [10] BALINESE MUSICAL SYMBOL DONG..BALINESE MUSICAL SYMBOL DANG GEDE +1B6B..1B73 ; Balinese # Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG +1B74..1B7C ; Balinese # So [9] BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG..BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING +1B7D..1B7E ; Balinese # Po [2] BALINESE PANTI LANTANG..BALINESE PAMADA LANTANG + +# Total code points: 124 + +# ================================================ + +12000..12399 ; Cuneiform # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U +12400..1246E ; Cuneiform # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM +12470..12474 ; Cuneiform # Po [5] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON +12480..12543 ; Cuneiform # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU + +# Total code points: 1234 + +# ================================================ + +10900..10915 ; Phoenician # Lo [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU +10916..1091B ; Phoenician # No [6] PHOENICIAN NUMBER ONE..PHOENICIAN NUMBER THREE +1091F ; Phoenician # Po PHOENICIAN WORD SEPARATOR + +# Total code points: 29 + +# ================================================ + +A840..A873 ; Phags_Pa # Lo [52] PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU +A874..A877 ; Phags_Pa # Po [4] PHAGS-PA SINGLE HEAD MARK..PHAGS-PA MARK DOUBLE SHAD + +# Total code points: 56 + +# ================================================ + +07C0..07C9 ; Nko # Nd [10] NKO DIGIT ZERO..NKO DIGIT NINE +07CA..07EA ; Nko # Lo [33] NKO LETTER A..NKO LETTER JONA RA +07EB..07F3 ; Nko # Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE +07F4..07F5 ; Nko # Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE +07F6 ; Nko # So NKO SYMBOL OO DENNEN +07F7..07F9 ; Nko # Po [3] NKO SYMBOL GBAKURUNEN..NKO EXCLAMATION MARK +07FA ; Nko # Lm NKO LAJANYALAN +07FD ; Nko # Mn NKO DANTAYALAN +07FE..07FF ; Nko # Sc [2] NKO DOROME SIGN..NKO TAMAN SIGN + +# Total code points: 62 + +# ================================================ + +1B80..1B81 ; Sundanese # Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR +1B82 ; Sundanese # Mc SUNDANESE SIGN PANGWISAD +1B83..1BA0 ; Sundanese # Lo [30] SUNDANESE LETTER A..SUNDANESE LETTER HA +1BA1 ; Sundanese # Mc SUNDANESE CONSONANT SIGN PAMINGKAL +1BA2..1BA5 ; Sundanese # Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU +1BA6..1BA7 ; Sundanese # Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG +1BA8..1BA9 ; Sundanese # Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG +1BAA ; Sundanese # Mc SUNDANESE SIGN PAMAAEH +1BAB..1BAD ; Sundanese # Mn [3] SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT SIGN PASANGAN WA +1BAE..1BAF ; Sundanese # Lo [2] SUNDANESE LETTER KHA..SUNDANESE LETTER SYA +1BB0..1BB9 ; Sundanese # Nd [10] SUNDANESE DIGIT ZERO..SUNDANESE DIGIT NINE +1BBA..1BBF ; Sundanese # Lo [6] SUNDANESE AVAGRAHA..SUNDANESE LETTER FINAL M +1CC0..1CC7 ; Sundanese # Po [8] SUNDANESE PUNCTUATION BINDU SURYA..SUNDANESE PUNCTUATION BINDU BA SATANGA + +# Total code points: 72 + +# ================================================ + +1C00..1C23 ; Lepcha # Lo [36] LEPCHA LETTER KA..LEPCHA LETTER A +1C24..1C2B ; Lepcha # Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU +1C2C..1C33 ; Lepcha # Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T +1C34..1C35 ; Lepcha # Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG +1C36..1C37 ; Lepcha # Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA +1C3B..1C3F ; Lepcha # Po [5] LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION TSHOOK +1C40..1C49 ; Lepcha # Nd [10] LEPCHA DIGIT ZERO..LEPCHA DIGIT NINE +1C4D..1C4F ; Lepcha # Lo [3] LEPCHA LETTER TTA..LEPCHA LETTER DDA + +# Total code points: 74 + +# ================================================ + +1C50..1C59 ; Ol_Chiki # Nd [10] OL CHIKI DIGIT ZERO..OL CHIKI DIGIT NINE +1C5A..1C77 ; Ol_Chiki # Lo [30] OL CHIKI LETTER LA..OL CHIKI LETTER OH +1C78..1C7D ; Ol_Chiki # Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD +1C7E..1C7F ; Ol_Chiki # Po [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD + +# Total code points: 48 + +# ================================================ + +A500..A60B ; Vai # Lo [268] VAI SYLLABLE EE..VAI SYLLABLE NG +A60C ; Vai # Lm VAI SYLLABLE LENGTHENER +A60D..A60F ; Vai # Po [3] VAI COMMA..VAI QUESTION MARK +A610..A61F ; Vai # Lo [16] VAI SYLLABLE NDOLE FA..VAI SYMBOL JONG +A620..A629 ; Vai # Nd [10] VAI DIGIT ZERO..VAI DIGIT NINE +A62A..A62B ; Vai # Lo [2] VAI SYLLABLE NDOLE MA..VAI SYLLABLE NDOLE DO + +# Total code points: 300 + +# ================================================ + +A880..A881 ; Saurashtra # Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA +A882..A8B3 ; Saurashtra # Lo [50] SAURASHTRA LETTER A..SAURASHTRA LETTER LLA +A8B4..A8C3 ; Saurashtra # Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU +A8C4..A8C5 ; Saurashtra # Mn [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU +A8CE..A8CF ; Saurashtra # Po [2] SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA +A8D0..A8D9 ; Saurashtra # Nd [10] SAURASHTRA DIGIT ZERO..SAURASHTRA DIGIT NINE + +# Total code points: 82 + +# ================================================ + +A900..A909 ; Kayah_Li # Nd [10] KAYAH LI DIGIT ZERO..KAYAH LI DIGIT NINE +A90A..A925 ; Kayah_Li # Lo [28] KAYAH LI LETTER KA..KAYAH LI LETTER OO +A926..A92D ; Kayah_Li # Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU +A92F ; Kayah_Li # Po KAYAH LI SIGN SHYA + +# Total code points: 47 + +# ================================================ + +A930..A946 ; Rejang # Lo [23] REJANG LETTER KA..REJANG LETTER A +A947..A951 ; Rejang # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R +A952..A953 ; Rejang # Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA +A95F ; Rejang # Po REJANG SECTION MARK + +# Total code points: 37 + +# ================================================ + +10280..1029C ; Lycian # Lo [29] LYCIAN LETTER A..LYCIAN LETTER X + +# Total code points: 29 + +# ================================================ + +102A0..102D0 ; Carian # Lo [49] CARIAN LETTER A..CARIAN LETTER UUU3 + +# Total code points: 49 + +# ================================================ + +10920..10939 ; Lydian # Lo [26] LYDIAN LETTER A..LYDIAN LETTER C +1093F ; Lydian # Po LYDIAN TRIANGULAR MARK + +# Total code points: 27 + +# ================================================ + +AA00..AA28 ; Cham # Lo [41] CHAM LETTER A..CHAM LETTER HA +AA29..AA2E ; Cham # Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE +AA2F..AA30 ; Cham # Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI +AA31..AA32 ; Cham # Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE +AA33..AA34 ; Cham # Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA +AA35..AA36 ; Cham # Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA +AA40..AA42 ; Cham # Lo [3] CHAM LETTER FINAL K..CHAM LETTER FINAL NG +AA43 ; Cham # Mn CHAM CONSONANT SIGN FINAL NG +AA44..AA4B ; Cham # Lo [8] CHAM LETTER FINAL CH..CHAM LETTER FINAL SS +AA4C ; Cham # Mn CHAM CONSONANT SIGN FINAL M +AA4D ; Cham # Mc CHAM CONSONANT SIGN FINAL H +AA50..AA59 ; Cham # Nd [10] CHAM DIGIT ZERO..CHAM DIGIT NINE +AA5C..AA5F ; Cham # Po [4] CHAM PUNCTUATION SPIRAL..CHAM PUNCTUATION TRIPLE DANDA + +# Total code points: 83 + +# ================================================ + +1A20..1A54 ; Tai_Tham # Lo [53] TAI THAM LETTER HIGH KA..TAI THAM LETTER GREAT SA +1A55 ; Tai_Tham # Mc TAI THAM CONSONANT SIGN MEDIAL RA +1A56 ; Tai_Tham # Mn TAI THAM CONSONANT SIGN MEDIAL LA +1A57 ; Tai_Tham # Mc TAI THAM CONSONANT SIGN LA TANG LAI +1A58..1A5E ; Tai_Tham # Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA +1A60 ; Tai_Tham # Mn TAI THAM SIGN SAKOT +1A61 ; Tai_Tham # Mc TAI THAM VOWEL SIGN A +1A62 ; Tai_Tham # Mn TAI THAM VOWEL SIGN MAI SAT +1A63..1A64 ; Tai_Tham # Mc [2] TAI THAM VOWEL SIGN AA..TAI THAM VOWEL SIGN TALL AA +1A65..1A6C ; Tai_Tham # Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW +1A6D..1A72 ; Tai_Tham # Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI +1A73..1A7C ; Tai_Tham # Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN +1A7F ; Tai_Tham # Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT +1A80..1A89 ; Tai_Tham # Nd [10] TAI THAM HORA DIGIT ZERO..TAI THAM HORA DIGIT NINE +1A90..1A99 ; Tai_Tham # Nd [10] TAI THAM THAM DIGIT ZERO..TAI THAM THAM DIGIT NINE +1AA0..1AA6 ; Tai_Tham # Po [7] TAI THAM SIGN WIANG..TAI THAM SIGN REVERSED ROTATED RANA +1AA7 ; Tai_Tham # Lm TAI THAM SIGN MAI YAMOK +1AA8..1AAD ; Tai_Tham # Po [6] TAI THAM SIGN KAAN..TAI THAM SIGN CAANG + +# Total code points: 127 + +# ================================================ + +AA80..AAAF ; Tai_Viet # Lo [48] TAI VIET LETTER LOW KO..TAI VIET LETTER HIGH O +AAB0 ; Tai_Viet # Mn TAI VIET MAI KANG +AAB1 ; Tai_Viet # Lo TAI VIET VOWEL AA +AAB2..AAB4 ; Tai_Viet # Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U +AAB5..AAB6 ; Tai_Viet # Lo [2] TAI VIET VOWEL E..TAI VIET VOWEL O +AAB7..AAB8 ; Tai_Viet # Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA +AAB9..AABD ; Tai_Viet # Lo [5] TAI VIET VOWEL UEA..TAI VIET VOWEL AN +AABE..AABF ; Tai_Viet # Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK +AAC0 ; Tai_Viet # Lo TAI VIET TONE MAI NUENG +AAC1 ; Tai_Viet # Mn TAI VIET TONE MAI THO +AAC2 ; Tai_Viet # Lo TAI VIET TONE MAI SONG +AADB..AADC ; Tai_Viet # Lo [2] TAI VIET SYMBOL KON..TAI VIET SYMBOL NUENG +AADD ; Tai_Viet # Lm TAI VIET SYMBOL SAM +AADE..AADF ; Tai_Viet # Po [2] TAI VIET SYMBOL HO HOI..TAI VIET SYMBOL KOI KOI + +# Total code points: 72 + +# ================================================ + +10B00..10B35 ; Avestan # Lo [54] AVESTAN LETTER A..AVESTAN LETTER HE +10B39..10B3F ; Avestan # Po [7] AVESTAN ABBREVIATION MARK..LARGE ONE RING OVER TWO RINGS PUNCTUATION + +# Total code points: 61 + +# ================================================ + +13000..1342F ; Egyptian_Hieroglyphs # Lo [1072] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH V011D +13430..1343F ; Egyptian_Hieroglyphs # Cf [16] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE +13440 ; Egyptian_Hieroglyphs # Mn EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY +13441..13446 ; Egyptian_Hieroglyphs # Lo [6] EGYPTIAN HIEROGLYPH FULL BLANK..EGYPTIAN HIEROGLYPH WIDE LOST SIGN +13447..13455 ; Egyptian_Hieroglyphs # Mn [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED + +# Total code points: 1110 + +# ================================================ + +0800..0815 ; Samaritan # Lo [22] SAMARITAN LETTER ALAF..SAMARITAN LETTER TAAF +0816..0819 ; Samaritan # Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH +081A ; Samaritan # Lm SAMARITAN MODIFIER LETTER EPENTHETIC YUT +081B..0823 ; Samaritan # Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A +0824 ; Samaritan # Lm SAMARITAN MODIFIER LETTER SHORT A +0825..0827 ; Samaritan # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U +0828 ; Samaritan # Lm SAMARITAN MODIFIER LETTER I +0829..082D ; Samaritan # Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA +0830..083E ; Samaritan # Po [15] SAMARITAN PUNCTUATION NEQUDAA..SAMARITAN PUNCTUATION ANNAAU + +# Total code points: 61 + +# ================================================ + +A4D0..A4F7 ; Lisu # Lo [40] LISU LETTER BA..LISU LETTER OE +A4F8..A4FD ; Lisu # Lm [6] LISU LETTER TONE MYA TI..LISU LETTER TONE MYA JEU +A4FE..A4FF ; Lisu # Po [2] LISU PUNCTUATION COMMA..LISU PUNCTUATION FULL STOP +11FB0 ; Lisu # Lo LISU LETTER YHA + +# Total code points: 49 + +# ================================================ + +A6A0..A6E5 ; Bamum # Lo [70] BAMUM LETTER A..BAMUM LETTER KI +A6E6..A6EF ; Bamum # Nl [10] BAMUM LETTER MO..BAMUM LETTER KOGHOM +A6F0..A6F1 ; Bamum # Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS +A6F2..A6F7 ; Bamum # Po [6] BAMUM NJAEMLI..BAMUM QUESTION MARK +16800..16A38 ; Bamum # Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ + +# Total code points: 657 + +# ================================================ + +A980..A982 ; Javanese # Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR +A983 ; Javanese # Mc JAVANESE SIGN WIGNYAN +A984..A9B2 ; Javanese # Lo [47] JAVANESE LETTER A..JAVANESE LETTER HA +A9B3 ; Javanese # Mn JAVANESE SIGN CECAK TELU +A9B4..A9B5 ; Javanese # Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG +A9B6..A9B9 ; Javanese # Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT +A9BA..A9BB ; Javanese # Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE +A9BC..A9BD ; Javanese # Mn [2] JAVANESE VOWEL SIGN PEPET..JAVANESE CONSONANT SIGN KERET +A9BE..A9C0 ; Javanese # Mc [3] JAVANESE CONSONANT SIGN PENGKAL..JAVANESE PANGKON +A9C1..A9CD ; Javanese # Po [13] JAVANESE LEFT RERENGGAN..JAVANESE TURNED PADA PISELEH +A9D0..A9D9 ; Javanese # Nd [10] JAVANESE DIGIT ZERO..JAVANESE DIGIT NINE +A9DE..A9DF ; Javanese # Po [2] JAVANESE PADA TIRTA TUMETES..JAVANESE PADA ISEN-ISEN + +# Total code points: 90 + +# ================================================ + +AAE0..AAEA ; Meetei_Mayek # Lo [11] MEETEI MAYEK LETTER E..MEETEI MAYEK LETTER SSA +AAEB ; Meetei_Mayek # Mc MEETEI MAYEK VOWEL SIGN II +AAEC..AAED ; Meetei_Mayek # Mn [2] MEETEI MAYEK VOWEL SIGN UU..MEETEI MAYEK VOWEL SIGN AAI +AAEE..AAEF ; Meetei_Mayek # Mc [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN AAU +AAF0..AAF1 ; Meetei_Mayek # Po [2] MEETEI MAYEK CHEIKHAN..MEETEI MAYEK AHANG KHUDAM +AAF2 ; Meetei_Mayek # Lo MEETEI MAYEK ANJI +AAF3..AAF4 ; Meetei_Mayek # Lm [2] MEETEI MAYEK SYLLABLE REPETITION MARK..MEETEI MAYEK WORD REPETITION MARK +AAF5 ; Meetei_Mayek # Mc MEETEI MAYEK VOWEL SIGN VISARGA +AAF6 ; Meetei_Mayek # Mn MEETEI MAYEK VIRAMA +ABC0..ABE2 ; Meetei_Mayek # Lo [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM +ABE3..ABE4 ; Meetei_Mayek # Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP +ABE5 ; Meetei_Mayek # Mn MEETEI MAYEK VOWEL SIGN ANAP +ABE6..ABE7 ; Meetei_Mayek # Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP +ABE8 ; Meetei_Mayek # Mn MEETEI MAYEK VOWEL SIGN UNAP +ABE9..ABEA ; Meetei_Mayek # Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG +ABEB ; Meetei_Mayek # Po MEETEI MAYEK CHEIKHEI +ABEC ; Meetei_Mayek # Mc MEETEI MAYEK LUM IYEK +ABED ; Meetei_Mayek # Mn MEETEI MAYEK APUN IYEK +ABF0..ABF9 ; Meetei_Mayek # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DIGIT NINE + +# Total code points: 79 + +# ================================================ + +10840..10855 ; Imperial_Aramaic # Lo [22] IMPERIAL ARAMAIC LETTER ALEPH..IMPERIAL ARAMAIC LETTER TAW +10857 ; Imperial_Aramaic # Po IMPERIAL ARAMAIC SECTION SIGN +10858..1085F ; Imperial_Aramaic # No [8] IMPERIAL ARAMAIC NUMBER ONE..IMPERIAL ARAMAIC NUMBER TEN THOUSAND + +# Total code points: 31 + +# ================================================ + +10A60..10A7C ; Old_South_Arabian # Lo [29] OLD SOUTH ARABIAN LETTER HE..OLD SOUTH ARABIAN LETTER THETH +10A7D..10A7E ; Old_South_Arabian # No [2] OLD SOUTH ARABIAN NUMBER ONE..OLD SOUTH ARABIAN NUMBER FIFTY +10A7F ; Old_South_Arabian # Po OLD SOUTH ARABIAN NUMERIC INDICATOR + +# Total code points: 32 + +# ================================================ + +10B40..10B55 ; Inscriptional_Parthian # Lo [22] INSCRIPTIONAL PARTHIAN LETTER ALEPH..INSCRIPTIONAL PARTHIAN LETTER TAW +10B58..10B5F ; Inscriptional_Parthian # No [8] INSCRIPTIONAL PARTHIAN NUMBER ONE..INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND + +# Total code points: 30 + +# ================================================ + +10B60..10B72 ; Inscriptional_Pahlavi # Lo [19] INSCRIPTIONAL PAHLAVI LETTER ALEPH..INSCRIPTIONAL PAHLAVI LETTER TAW +10B78..10B7F ; Inscriptional_Pahlavi # No [8] INSCRIPTIONAL PAHLAVI NUMBER ONE..INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND + +# Total code points: 27 + +# ================================================ + +10C00..10C48 ; Old_Turkic # Lo [73] OLD TURKIC LETTER ORKHON A..OLD TURKIC LETTER ORKHON BASH + +# Total code points: 73 + +# ================================================ + +11080..11081 ; Kaithi # Mn [2] KAITHI SIGN CANDRABINDU..KAITHI SIGN ANUSVARA +11082 ; Kaithi # Mc KAITHI SIGN VISARGA +11083..110AF ; Kaithi # Lo [45] KAITHI LETTER A..KAITHI LETTER HA +110B0..110B2 ; Kaithi # Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II +110B3..110B6 ; Kaithi # Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI +110B7..110B8 ; Kaithi # Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU +110B9..110BA ; Kaithi # Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA +110BB..110BC ; Kaithi # Po [2] KAITHI ABBREVIATION SIGN..KAITHI ENUMERATION SIGN +110BD ; Kaithi # Cf KAITHI NUMBER SIGN +110BE..110C1 ; Kaithi # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA +110C2 ; Kaithi # Mn KAITHI VOWEL SIGN VOCALIC R +110CD ; Kaithi # Cf KAITHI NUMBER SIGN ABOVE + +# Total code points: 68 + +# ================================================ + +1BC0..1BE5 ; Batak # Lo [38] BATAK LETTER A..BATAK LETTER U +1BE6 ; Batak # Mn BATAK SIGN TOMPI +1BE7 ; Batak # Mc BATAK VOWEL SIGN E +1BE8..1BE9 ; Batak # Mn [2] BATAK VOWEL SIGN PAKPAK E..BATAK VOWEL SIGN EE +1BEA..1BEC ; Batak # Mc [3] BATAK VOWEL SIGN I..BATAK VOWEL SIGN O +1BED ; Batak # Mn BATAK VOWEL SIGN KARO O +1BEE ; Batak # Mc BATAK VOWEL SIGN U +1BEF..1BF1 ; Batak # Mn [3] BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H +1BF2..1BF3 ; Batak # Mc [2] BATAK PANGOLAT..BATAK PANONGONAN +1BFC..1BFF ; Batak # Po [4] BATAK SYMBOL BINDU NA METEK..BATAK SYMBOL BINDU PANGOLAT + +# Total code points: 56 + +# ================================================ + +11000 ; Brahmi # Mc BRAHMI SIGN CANDRABINDU +11001 ; Brahmi # Mn BRAHMI SIGN ANUSVARA +11002 ; Brahmi # Mc BRAHMI SIGN VISARGA +11003..11037 ; Brahmi # Lo [53] BRAHMI SIGN JIHVAMULIYA..BRAHMI LETTER OLD TAMIL NNNA +11038..11046 ; Brahmi # Mn [15] BRAHMI VOWEL SIGN AA..BRAHMI VIRAMA +11047..1104D ; Brahmi # Po [7] BRAHMI DANDA..BRAHMI PUNCTUATION LOTUS +11052..11065 ; Brahmi # No [20] BRAHMI NUMBER ONE..BRAHMI NUMBER ONE THOUSAND +11066..1106F ; Brahmi # Nd [10] BRAHMI DIGIT ZERO..BRAHMI DIGIT NINE +11070 ; Brahmi # Mn BRAHMI SIGN OLD TAMIL VIRAMA +11071..11072 ; Brahmi # Lo [2] BRAHMI LETTER OLD TAMIL SHORT E..BRAHMI LETTER OLD TAMIL SHORT O +11073..11074 ; Brahmi # Mn [2] BRAHMI VOWEL SIGN OLD TAMIL SHORT E..BRAHMI VOWEL SIGN OLD TAMIL SHORT O +11075 ; Brahmi # Lo BRAHMI LETTER OLD TAMIL LLA +1107F ; Brahmi # Mn BRAHMI NUMBER JOINER + +# Total code points: 115 + +# ================================================ + +0840..0858 ; Mandaic # Lo [25] MANDAIC LETTER HALQA..MANDAIC LETTER AIN +0859..085B ; Mandaic # Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK +085E ; Mandaic # Po MANDAIC PUNCTUATION + +# Total code points: 29 + +# ================================================ + +11100..11102 ; Chakma # Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA +11103..11126 ; Chakma # Lo [36] CHAKMA LETTER AA..CHAKMA LETTER HAA +11127..1112B ; Chakma # Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU +1112C ; Chakma # Mc CHAKMA VOWEL SIGN E +1112D..11134 ; Chakma # Mn [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA +11136..1113F ; Chakma # Nd [10] CHAKMA DIGIT ZERO..CHAKMA DIGIT NINE +11140..11143 ; Chakma # Po [4] CHAKMA SECTION MARK..CHAKMA QUESTION MARK +11144 ; Chakma # Lo CHAKMA LETTER LHAA +11145..11146 ; Chakma # Mc [2] CHAKMA VOWEL SIGN AA..CHAKMA VOWEL SIGN EI +11147 ; Chakma # Lo CHAKMA LETTER VAA + +# Total code points: 71 + +# ================================================ + +109A0..109B7 ; Meroitic_Cursive # Lo [24] MEROITIC CURSIVE LETTER A..MEROITIC CURSIVE LETTER DA +109BC..109BD ; Meroitic_Cursive # No [2] MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS..MEROITIC CURSIVE FRACTION ONE HALF +109BE..109BF ; Meroitic_Cursive # Lo [2] MEROITIC CURSIVE LOGOGRAM RMT..MEROITIC CURSIVE LOGOGRAM IMN +109C0..109CF ; Meroitic_Cursive # No [16] MEROITIC CURSIVE NUMBER ONE..MEROITIC CURSIVE NUMBER SEVENTY +109D2..109FF ; Meroitic_Cursive # No [46] MEROITIC CURSIVE NUMBER ONE HUNDRED..MEROITIC CURSIVE FRACTION TEN TWELFTHS + +# Total code points: 90 + +# ================================================ + +10980..1099F ; Meroitic_Hieroglyphs # Lo [32] MEROITIC HIEROGLYPHIC LETTER A..MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2 + +# Total code points: 32 + +# ================================================ + +16F00..16F4A ; Miao # Lo [75] MIAO LETTER PA..MIAO LETTER RTE +16F4F ; Miao # Mn MIAO SIGN CONSONANT MODIFIER BAR +16F50 ; Miao # Lo MIAO LETTER NASALIZATION +16F51..16F87 ; Miao # Mc [55] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN UI +16F8F..16F92 ; Miao # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW +16F93..16F9F ; Miao # Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8 + +# Total code points: 149 + +# ================================================ + +11180..11181 ; Sharada # Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA +11182 ; Sharada # Mc SHARADA SIGN VISARGA +11183..111B2 ; Sharada # Lo [48] SHARADA LETTER A..SHARADA LETTER HA +111B3..111B5 ; Sharada # Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II +111B6..111BE ; Sharada # Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O +111BF..111C0 ; Sharada # Mc [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA +111C1..111C4 ; Sharada # Lo [4] SHARADA SIGN AVAGRAHA..SHARADA OM +111C5..111C8 ; Sharada # Po [4] SHARADA DANDA..SHARADA SEPARATOR +111C9..111CC ; Sharada # Mn [4] SHARADA SANDHI MARK..SHARADA EXTRA SHORT VOWEL MARK +111CD ; Sharada # Po SHARADA SUTRA MARK +111CE ; Sharada # Mc SHARADA VOWEL SIGN PRISHTHAMATRA E +111CF ; Sharada # Mn SHARADA SIGN INVERTED CANDRABINDU +111D0..111D9 ; Sharada # Nd [10] SHARADA DIGIT ZERO..SHARADA DIGIT NINE +111DA ; Sharada # Lo SHARADA EKAM +111DB ; Sharada # Po SHARADA SIGN SIDDHAM +111DC ; Sharada # Lo SHARADA HEADSTROKE +111DD..111DF ; Sharada # Po [3] SHARADA CONTINUATION SIGN..SHARADA SECTION MARK-2 + +# Total code points: 96 + +# ================================================ + +110D0..110E8 ; Sora_Sompeng # Lo [25] SORA SOMPENG LETTER SAH..SORA SOMPENG LETTER MAE +110F0..110F9 ; Sora_Sompeng # Nd [10] SORA SOMPENG DIGIT ZERO..SORA SOMPENG DIGIT NINE + +# Total code points: 35 + +# ================================================ + +11680..116AA ; Takri # Lo [43] TAKRI LETTER A..TAKRI LETTER RRA +116AB ; Takri # Mn TAKRI SIGN ANUSVARA +116AC ; Takri # Mc TAKRI SIGN VISARGA +116AD ; Takri # Mn TAKRI VOWEL SIGN AA +116AE..116AF ; Takri # Mc [2] TAKRI VOWEL SIGN I..TAKRI VOWEL SIGN II +116B0..116B5 ; Takri # Mn [6] TAKRI VOWEL SIGN U..TAKRI VOWEL SIGN AU +116B6 ; Takri # Mc TAKRI SIGN VIRAMA +116B7 ; Takri # Mn TAKRI SIGN NUKTA +116B8 ; Takri # Lo TAKRI LETTER ARCHAIC KHA +116B9 ; Takri # Po TAKRI ABBREVIATION SIGN +116C0..116C9 ; Takri # Nd [10] TAKRI DIGIT ZERO..TAKRI DIGIT NINE + +# Total code points: 68 + +# ================================================ + +10530..10563 ; Caucasian_Albanian # Lo [52] CAUCASIAN ALBANIAN LETTER ALT..CAUCASIAN ALBANIAN LETTER KIW +1056F ; Caucasian_Albanian # Po CAUCASIAN ALBANIAN CITATION MARK + +# Total code points: 53 + +# ================================================ + +16AD0..16AED ; Bassa_Vah # Lo [30] BASSA VAH LETTER ENNI..BASSA VAH LETTER I +16AF0..16AF4 ; Bassa_Vah # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE +16AF5 ; Bassa_Vah # Po BASSA VAH FULL STOP + +# Total code points: 36 + +# ================================================ + +1BC00..1BC6A ; Duployan # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M +1BC70..1BC7C ; Duployan # Lo [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK +1BC80..1BC88 ; Duployan # Lo [9] DUPLOYAN AFFIX HIGH ACUTE..DUPLOYAN AFFIX HIGH VERTICAL +1BC90..1BC99 ; Duployan # Lo [10] DUPLOYAN AFFIX LOW ACUTE..DUPLOYAN AFFIX LOW ARROW +1BC9C ; Duployan # So DUPLOYAN SIGN O WITH CROSS +1BC9D..1BC9E ; Duployan # Mn [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK +1BC9F ; Duployan # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP + +# Total code points: 143 + +# ================================================ + +10500..10527 ; Elbasan # Lo [40] ELBASAN LETTER A..ELBASAN LETTER KHE + +# Total code points: 40 + +# ================================================ + +11300..11301 ; Grantha # Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU +11302..11303 ; Grantha # Mc [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA +11305..1130C ; Grantha # Lo [8] GRANTHA LETTER A..GRANTHA LETTER VOCALIC L +1130F..11310 ; Grantha # Lo [2] GRANTHA LETTER EE..GRANTHA LETTER AI +11313..11328 ; Grantha # Lo [22] GRANTHA LETTER OO..GRANTHA LETTER NA +1132A..11330 ; Grantha # Lo [7] GRANTHA LETTER PA..GRANTHA LETTER RA +11332..11333 ; Grantha # Lo [2] GRANTHA LETTER LA..GRANTHA LETTER LLA +11335..11339 ; Grantha # Lo [5] GRANTHA LETTER VA..GRANTHA LETTER HA +1133C ; Grantha # Mn GRANTHA SIGN NUKTA +1133D ; Grantha # Lo GRANTHA SIGN AVAGRAHA +1133E..1133F ; Grantha # Mc [2] GRANTHA VOWEL SIGN AA..GRANTHA VOWEL SIGN I +11340 ; Grantha # Mn GRANTHA VOWEL SIGN II +11341..11344 ; Grantha # Mc [4] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN VOCALIC RR +11347..11348 ; Grantha # Mc [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI +1134B..1134D ; Grantha # Mc [3] GRANTHA VOWEL SIGN OO..GRANTHA SIGN VIRAMA +11350 ; Grantha # Lo GRANTHA OM +11357 ; Grantha # Mc GRANTHA AU LENGTH MARK +1135D..11361 ; Grantha # Lo [5] GRANTHA SIGN PLUTA..GRANTHA LETTER VOCALIC LL +11362..11363 ; Grantha # Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL +11366..1136C ; Grantha # Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX +11370..11374 ; Grantha # Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA + +# Total code points: 85 + +# ================================================ + +16B00..16B2F ; Pahawh_Hmong # Lo [48] PAHAWH HMONG VOWEL KEEB..PAHAWH HMONG CONSONANT CAU +16B30..16B36 ; Pahawh_Hmong # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM +16B37..16B3B ; Pahawh_Hmong # Po [5] PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN VOS FEEM +16B3C..16B3F ; Pahawh_Hmong # So [4] PAHAWH HMONG SIGN XYEEM NTXIV..PAHAWH HMONG SIGN XYEEM FAIB +16B40..16B43 ; Pahawh_Hmong # Lm [4] PAHAWH HMONG SIGN VOS SEEV..PAHAWH HMONG SIGN IB YAM +16B44 ; Pahawh_Hmong # Po PAHAWH HMONG SIGN XAUS +16B45 ; Pahawh_Hmong # So PAHAWH HMONG SIGN CIM TSOV ROG +16B50..16B59 ; Pahawh_Hmong # Nd [10] PAHAWH HMONG DIGIT ZERO..PAHAWH HMONG DIGIT NINE +16B5B..16B61 ; Pahawh_Hmong # No [7] PAHAWH HMONG NUMBER TENS..PAHAWH HMONG NUMBER TRILLIONS +16B63..16B77 ; Pahawh_Hmong # Lo [21] PAHAWH HMONG SIGN VOS LUB..PAHAWH HMONG SIGN CIM NRES TOS +16B7D..16B8F ; Pahawh_Hmong # Lo [19] PAHAWH HMONG CLAN SIGN TSHEEJ..PAHAWH HMONG CLAN SIGN VWJ + +# Total code points: 127 + +# ================================================ + +11200..11211 ; Khojki # Lo [18] KHOJKI LETTER A..KHOJKI LETTER JJA +11213..1122B ; Khojki # Lo [25] KHOJKI LETTER NYA..KHOJKI LETTER LLA +1122C..1122E ; Khojki # Mc [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II +1122F..11231 ; Khojki # Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI +11232..11233 ; Khojki # Mc [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU +11234 ; Khojki # Mn KHOJKI SIGN ANUSVARA +11235 ; Khojki # Mc KHOJKI SIGN VIRAMA +11236..11237 ; Khojki # Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA +11238..1123D ; Khojki # Po [6] KHOJKI DANDA..KHOJKI ABBREVIATION SIGN +1123E ; Khojki # Mn KHOJKI SIGN SUKUN +1123F..11240 ; Khojki # Lo [2] KHOJKI LETTER QA..KHOJKI LETTER SHORT I +11241 ; Khojki # Mn KHOJKI VOWEL SIGN VOCALIC R + +# Total code points: 65 + +# ================================================ + +10600..10736 ; Linear_A # Lo [311] LINEAR A SIGN AB001..LINEAR A SIGN A664 +10740..10755 ; Linear_A # Lo [22] LINEAR A SIGN A701 A..LINEAR A SIGN A732 JE +10760..10767 ; Linear_A # Lo [8] LINEAR A SIGN A800..LINEAR A SIGN A807 + +# Total code points: 341 + +# ================================================ + +11150..11172 ; Mahajani # Lo [35] MAHAJANI LETTER A..MAHAJANI LETTER RRA +11173 ; Mahajani # Mn MAHAJANI SIGN NUKTA +11174..11175 ; Mahajani # Po [2] MAHAJANI ABBREVIATION SIGN..MAHAJANI SECTION MARK +11176 ; Mahajani # Lo MAHAJANI LIGATURE SHRI + +# Total code points: 39 + +# ================================================ + +10AC0..10AC7 ; Manichaean # Lo [8] MANICHAEAN LETTER ALEPH..MANICHAEAN LETTER WAW +10AC8 ; Manichaean # So MANICHAEAN SIGN UD +10AC9..10AE4 ; Manichaean # Lo [28] MANICHAEAN LETTER ZAYIN..MANICHAEAN LETTER TAW +10AE5..10AE6 ; Manichaean # Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW +10AEB..10AEF ; Manichaean # No [5] MANICHAEAN NUMBER ONE..MANICHAEAN NUMBER ONE HUNDRED +10AF0..10AF6 ; Manichaean # Po [7] MANICHAEAN PUNCTUATION STAR..MANICHAEAN PUNCTUATION LINE FILLER + +# Total code points: 51 + +# ================================================ + +1E800..1E8C4 ; Mende_Kikakui # Lo [197] MENDE KIKAKUI SYLLABLE M001 KI..MENDE KIKAKUI SYLLABLE M060 NYON +1E8C7..1E8CF ; Mende_Kikakui # No [9] MENDE KIKAKUI DIGIT ONE..MENDE KIKAKUI DIGIT NINE +1E8D0..1E8D6 ; Mende_Kikakui # Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS + +# Total code points: 213 + +# ================================================ + +11600..1162F ; Modi # Lo [48] MODI LETTER A..MODI LETTER LLA +11630..11632 ; Modi # Mc [3] MODI VOWEL SIGN AA..MODI VOWEL SIGN II +11633..1163A ; Modi # Mn [8] MODI VOWEL SIGN U..MODI VOWEL SIGN AI +1163B..1163C ; Modi # Mc [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU +1163D ; Modi # Mn MODI SIGN ANUSVARA +1163E ; Modi # Mc MODI SIGN VISARGA +1163F..11640 ; Modi # Mn [2] MODI SIGN VIRAMA..MODI SIGN ARDHACANDRA +11641..11643 ; Modi # Po [3] MODI DANDA..MODI ABBREVIATION SIGN +11644 ; Modi # Lo MODI SIGN HUVA +11650..11659 ; Modi # Nd [10] MODI DIGIT ZERO..MODI DIGIT NINE + +# Total code points: 79 + +# ================================================ + +16A40..16A5E ; Mro # Lo [31] MRO LETTER TA..MRO LETTER TEK +16A60..16A69 ; Mro # Nd [10] MRO DIGIT ZERO..MRO DIGIT NINE +16A6E..16A6F ; Mro # Po [2] MRO DANDA..MRO DOUBLE DANDA + +# Total code points: 43 + +# ================================================ + +10A80..10A9C ; Old_North_Arabian # Lo [29] OLD NORTH ARABIAN LETTER HEH..OLD NORTH ARABIAN LETTER ZAH +10A9D..10A9F ; Old_North_Arabian # No [3] OLD NORTH ARABIAN NUMBER ONE..OLD NORTH ARABIAN NUMBER TWENTY + +# Total code points: 32 + +# ================================================ + +10880..1089E ; Nabataean # Lo [31] NABATAEAN LETTER FINAL ALEPH..NABATAEAN LETTER TAW +108A7..108AF ; Nabataean # No [9] NABATAEAN NUMBER ONE..NABATAEAN NUMBER ONE HUNDRED + +# Total code points: 40 + +# ================================================ + +10860..10876 ; Palmyrene # Lo [23] PALMYRENE LETTER ALEPH..PALMYRENE LETTER TAW +10877..10878 ; Palmyrene # So [2] PALMYRENE LEFT-POINTING FLEURON..PALMYRENE RIGHT-POINTING FLEURON +10879..1087F ; Palmyrene # No [7] PALMYRENE NUMBER ONE..PALMYRENE NUMBER TWENTY + +# Total code points: 32 + +# ================================================ + +11AC0..11AF8 ; Pau_Cin_Hau # Lo [57] PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL + +# Total code points: 57 + +# ================================================ + +10350..10375 ; Old_Permic # Lo [38] OLD PERMIC LETTER AN..OLD PERMIC LETTER IA +10376..1037A ; Old_Permic # Mn [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII + +# Total code points: 43 + +# ================================================ + +10B80..10B91 ; Psalter_Pahlavi # Lo [18] PSALTER PAHLAVI LETTER ALEPH..PSALTER PAHLAVI LETTER TAW +10B99..10B9C ; Psalter_Pahlavi # Po [4] PSALTER PAHLAVI SECTION MARK..PSALTER PAHLAVI FOUR DOTS WITH DOT +10BA9..10BAF ; Psalter_Pahlavi # No [7] PSALTER PAHLAVI NUMBER ONE..PSALTER PAHLAVI NUMBER ONE HUNDRED + +# Total code points: 29 + +# ================================================ + +11580..115AE ; Siddham # Lo [47] SIDDHAM LETTER A..SIDDHAM LETTER HA +115AF..115B1 ; Siddham # Mc [3] SIDDHAM VOWEL SIGN AA..SIDDHAM VOWEL SIGN II +115B2..115B5 ; Siddham # Mn [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR +115B8..115BB ; Siddham # Mc [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU +115BC..115BD ; Siddham # Mn [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA +115BE ; Siddham # Mc SIDDHAM SIGN VISARGA +115BF..115C0 ; Siddham # Mn [2] SIDDHAM SIGN VIRAMA..SIDDHAM SIGN NUKTA +115C1..115D7 ; Siddham # Po [23] SIDDHAM SIGN SIDDHAM..SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES +115D8..115DB ; Siddham # Lo [4] SIDDHAM LETTER THREE-CIRCLE ALTERNATE I..SIDDHAM LETTER ALTERNATE U +115DC..115DD ; Siddham # Mn [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU + +# Total code points: 92 + +# ================================================ + +112B0..112DE ; Khudawadi # Lo [47] KHUDAWADI LETTER A..KHUDAWADI LETTER HA +112DF ; Khudawadi # Mn KHUDAWADI SIGN ANUSVARA +112E0..112E2 ; Khudawadi # Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II +112E3..112EA ; Khudawadi # Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA +112F0..112F9 ; Khudawadi # Nd [10] KHUDAWADI DIGIT ZERO..KHUDAWADI DIGIT NINE + +# Total code points: 69 + +# ================================================ + +11480..114AF ; Tirhuta # Lo [48] TIRHUTA ANJI..TIRHUTA LETTER HA +114B0..114B2 ; Tirhuta # Mc [3] TIRHUTA VOWEL SIGN AA..TIRHUTA VOWEL SIGN II +114B3..114B8 ; Tirhuta # Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL +114B9 ; Tirhuta # Mc TIRHUTA VOWEL SIGN E +114BA ; Tirhuta # Mn TIRHUTA VOWEL SIGN SHORT E +114BB..114BE ; Tirhuta # Mc [4] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN AU +114BF..114C0 ; Tirhuta # Mn [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA +114C1 ; Tirhuta # Mc TIRHUTA SIGN VISARGA +114C2..114C3 ; Tirhuta # Mn [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA +114C4..114C5 ; Tirhuta # Lo [2] TIRHUTA SIGN AVAGRAHA..TIRHUTA GVANG +114C6 ; Tirhuta # Po TIRHUTA ABBREVIATION SIGN +114C7 ; Tirhuta # Lo TIRHUTA OM +114D0..114D9 ; Tirhuta # Nd [10] TIRHUTA DIGIT ZERO..TIRHUTA DIGIT NINE + +# Total code points: 82 + +# ================================================ + +118A0..118DF ; Warang_Citi # L& [64] WARANG CITI CAPITAL LETTER NGAA..WARANG CITI SMALL LETTER VIYO +118E0..118E9 ; Warang_Citi # Nd [10] WARANG CITI DIGIT ZERO..WARANG CITI DIGIT NINE +118EA..118F2 ; Warang_Citi # No [9] WARANG CITI NUMBER TEN..WARANG CITI NUMBER NINETY +118FF ; Warang_Citi # Lo WARANG CITI OM + +# Total code points: 84 + +# ================================================ + +11700..1171A ; Ahom # Lo [27] AHOM LETTER KA..AHOM LETTER ALTERNATE BA +1171D..1171F ; Ahom # Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA +11720..11721 ; Ahom # Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA +11722..11725 ; Ahom # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU +11726 ; Ahom # Mc AHOM VOWEL SIGN E +11727..1172B ; Ahom # Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER +11730..11739 ; Ahom # Nd [10] AHOM DIGIT ZERO..AHOM DIGIT NINE +1173A..1173B ; Ahom # No [2] AHOM NUMBER TEN..AHOM NUMBER TWENTY +1173C..1173E ; Ahom # Po [3] AHOM SIGN SMALL SECTION..AHOM SIGN RULAI +1173F ; Ahom # So AHOM SYMBOL VI +11740..11746 ; Ahom # Lo [7] AHOM LETTER CA..AHOM LETTER LLA + +# Total code points: 65 + +# ================================================ + +14400..14646 ; Anatolian_Hieroglyphs # Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530 + +# Total code points: 583 + +# ================================================ + +108E0..108F2 ; Hatran # Lo [19] HATRAN LETTER ALEPH..HATRAN LETTER QOPH +108F4..108F5 ; Hatran # Lo [2] HATRAN LETTER SHIN..HATRAN LETTER TAW +108FB..108FF ; Hatran # No [5] HATRAN NUMBER ONE..HATRAN NUMBER ONE HUNDRED + +# Total code points: 26 + +# ================================================ + +11280..11286 ; Multani # Lo [7] MULTANI LETTER A..MULTANI LETTER GA +11288 ; Multani # Lo MULTANI LETTER GHA +1128A..1128D ; Multani # Lo [4] MULTANI LETTER CA..MULTANI LETTER JJA +1128F..1129D ; Multani # Lo [15] MULTANI LETTER NYA..MULTANI LETTER BA +1129F..112A8 ; Multani # Lo [10] MULTANI LETTER BHA..MULTANI LETTER RHA +112A9 ; Multani # Po MULTANI SECTION MARK + +# Total code points: 38 + +# ================================================ + +10C80..10CB2 ; Old_Hungarian # L& [51] OLD HUNGARIAN CAPITAL LETTER A..OLD HUNGARIAN CAPITAL LETTER US +10CC0..10CF2 ; Old_Hungarian # L& [51] OLD HUNGARIAN SMALL LETTER A..OLD HUNGARIAN SMALL LETTER US +10CFA..10CFF ; Old_Hungarian # No [6] OLD HUNGARIAN NUMBER ONE..OLD HUNGARIAN NUMBER ONE THOUSAND + +# Total code points: 108 + +# ================================================ + +1D800..1D9FF ; SignWriting # So [512] SIGNWRITING HAND-FIST INDEX..SIGNWRITING HEAD +1DA00..1DA36 ; SignWriting # Mn [55] SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN +1DA37..1DA3A ; SignWriting # So [4] SIGNWRITING AIR BLOW SMALL ROTATIONS..SIGNWRITING BREATH EXHALE +1DA3B..1DA6C ; SignWriting # Mn [50] SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT +1DA6D..1DA74 ; SignWriting # So [8] SIGNWRITING SHOULDER HIP SPINE..SIGNWRITING TORSO-FLOORPLANE TWISTING +1DA75 ; SignWriting # Mn SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS +1DA76..1DA83 ; SignWriting # So [14] SIGNWRITING LIMB COMBINATION..SIGNWRITING LOCATION DEPTH +1DA84 ; SignWriting # Mn SIGNWRITING LOCATION HEAD NECK +1DA85..1DA86 ; SignWriting # So [2] SIGNWRITING LOCATION TORSO..SIGNWRITING LOCATION LIMBS DIGITS +1DA87..1DA8B ; SignWriting # Po [5] SIGNWRITING COMMA..SIGNWRITING PARENTHESIS +1DA9B..1DA9F ; SignWriting # Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 +1DAA1..1DAAF ; SignWriting # Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 + +# Total code points: 672 + +# ================================================ + +1E900..1E943 ; Adlam # L& [68] ADLAM CAPITAL LETTER ALIF..ADLAM SMALL LETTER SHA +1E944..1E94A ; Adlam # Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA +1E94B ; Adlam # Lm ADLAM NASALIZATION MARK +1E950..1E959 ; Adlam # Nd [10] ADLAM DIGIT ZERO..ADLAM DIGIT NINE +1E95E..1E95F ; Adlam # Po [2] ADLAM INITIAL EXCLAMATION MARK..ADLAM INITIAL QUESTION MARK + +# Total code points: 88 + +# ================================================ + +11C00..11C08 ; Bhaiksuki # Lo [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L +11C0A..11C2E ; Bhaiksuki # Lo [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA +11C2F ; Bhaiksuki # Mc BHAIKSUKI VOWEL SIGN AA +11C30..11C36 ; Bhaiksuki # Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L +11C38..11C3D ; Bhaiksuki # Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA +11C3E ; Bhaiksuki # Mc BHAIKSUKI SIGN VISARGA +11C3F ; Bhaiksuki # Mn BHAIKSUKI SIGN VIRAMA +11C40 ; Bhaiksuki # Lo BHAIKSUKI SIGN AVAGRAHA +11C41..11C45 ; Bhaiksuki # Po [5] BHAIKSUKI DANDA..BHAIKSUKI GAP FILLER-2 +11C50..11C59 ; Bhaiksuki # Nd [10] BHAIKSUKI DIGIT ZERO..BHAIKSUKI DIGIT NINE +11C5A..11C6C ; Bhaiksuki # No [19] BHAIKSUKI NUMBER ONE..BHAIKSUKI HUNDREDS UNIT MARK + +# Total code points: 97 + +# ================================================ + +11C70..11C71 ; Marchen # Po [2] MARCHEN HEAD MARK..MARCHEN MARK SHAD +11C72..11C8F ; Marchen # Lo [30] MARCHEN LETTER KA..MARCHEN LETTER A +11C92..11CA7 ; Marchen # Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA +11CA9 ; Marchen # Mc MARCHEN SUBJOINED LETTER YA +11CAA..11CB0 ; Marchen # Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA +11CB1 ; Marchen # Mc MARCHEN VOWEL SIGN I +11CB2..11CB3 ; Marchen # Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E +11CB4 ; Marchen # Mc MARCHEN VOWEL SIGN O +11CB5..11CB6 ; Marchen # Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU + +# Total code points: 68 + +# ================================================ + +11400..11434 ; Newa # Lo [53] NEWA LETTER A..NEWA LETTER HA +11435..11437 ; Newa # Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II +11438..1143F ; Newa # Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI +11440..11441 ; Newa # Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU +11442..11444 ; Newa # Mn [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA +11445 ; Newa # Mc NEWA SIGN VISARGA +11446 ; Newa # Mn NEWA SIGN NUKTA +11447..1144A ; Newa # Lo [4] NEWA SIGN AVAGRAHA..NEWA SIDDHI +1144B..1144F ; Newa # Po [5] NEWA DANDA..NEWA ABBREVIATION SIGN +11450..11459 ; Newa # Nd [10] NEWA DIGIT ZERO..NEWA DIGIT NINE +1145A..1145B ; Newa # Po [2] NEWA DOUBLE COMMA..NEWA PLACEHOLDER MARK +1145D ; Newa # Po NEWA INSERTION SIGN +1145E ; Newa # Mn NEWA SANDHI MARK +1145F..11461 ; Newa # Lo [3] NEWA LETTER VEDIC ANUSVARA..NEWA SIGN UPADHMANIYA + +# Total code points: 97 + +# ================================================ + +104B0..104D3 ; Osage # L& [36] OSAGE CAPITAL LETTER A..OSAGE CAPITAL LETTER ZHA +104D8..104FB ; Osage # L& [36] OSAGE SMALL LETTER A..OSAGE SMALL LETTER ZHA + +# Total code points: 72 + +# ================================================ + +16FE0 ; Tangut # Lm TANGUT ITERATION MARK +17000..187F7 ; Tangut # Lo [6136] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187F7 +18800..18AFF ; Tangut # Lo [768] TANGUT COMPONENT-001..TANGUT COMPONENT-768 +18D00..18D08 ; Tangut # Lo [9] TANGUT IDEOGRAPH-18D00..TANGUT IDEOGRAPH-18D08 + +# Total code points: 6914 + +# ================================================ + +11D00..11D06 ; Masaram_Gondi # Lo [7] MASARAM GONDI LETTER A..MASARAM GONDI LETTER E +11D08..11D09 ; Masaram_Gondi # Lo [2] MASARAM GONDI LETTER AI..MASARAM GONDI LETTER O +11D0B..11D30 ; Masaram_Gondi # Lo [38] MASARAM GONDI LETTER AU..MASARAM GONDI LETTER TRA +11D31..11D36 ; Masaram_Gondi # Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R +11D3A ; Masaram_Gondi # Mn MASARAM GONDI VOWEL SIGN E +11D3C..11D3D ; Masaram_Gondi # Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O +11D3F..11D45 ; Masaram_Gondi # Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA +11D46 ; Masaram_Gondi # Lo MASARAM GONDI REPHA +11D47 ; Masaram_Gondi # Mn MASARAM GONDI RA-KARA +11D50..11D59 ; Masaram_Gondi # Nd [10] MASARAM GONDI DIGIT ZERO..MASARAM GONDI DIGIT NINE + +# Total code points: 75 + +# ================================================ + +16FE1 ; Nushu # Lm NUSHU ITERATION MARK +1B170..1B2FB ; Nushu # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB + +# Total code points: 397 + +# ================================================ + +11A50 ; Soyombo # Lo SOYOMBO LETTER A +11A51..11A56 ; Soyombo # Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE +11A57..11A58 ; Soyombo # Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU +11A59..11A5B ; Soyombo # Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK +11A5C..11A89 ; Soyombo # Lo [46] SOYOMBO LETTER KA..SOYOMBO CLUSTER-INITIAL LETTER SA +11A8A..11A96 ; Soyombo # Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA +11A97 ; Soyombo # Mc SOYOMBO SIGN VISARGA +11A98..11A99 ; Soyombo # Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER +11A9A..11A9C ; Soyombo # Po [3] SOYOMBO MARK TSHEG..SOYOMBO MARK DOUBLE SHAD +11A9D ; Soyombo # Lo SOYOMBO MARK PLUTA +11A9E..11AA2 ; Soyombo # Po [5] SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME..SOYOMBO TERMINAL MARK-2 + +# Total code points: 83 + +# ================================================ + +11A00 ; Zanabazar_Square # Lo ZANABAZAR SQUARE LETTER A +11A01..11A0A ; Zanabazar_Square # Mn [10] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL LENGTH MARK +11A0B..11A32 ; Zanabazar_Square # Lo [40] ZANABAZAR SQUARE LETTER KA..ZANABAZAR SQUARE LETTER KSSA +11A33..11A38 ; Zanabazar_Square # Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA +11A39 ; Zanabazar_Square # Mc ZANABAZAR SQUARE SIGN VISARGA +11A3A ; Zanabazar_Square # Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA +11A3B..11A3E ; Zanabazar_Square # Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA +11A3F..11A46 ; Zanabazar_Square # Po [8] ZANABAZAR SQUARE INITIAL HEAD MARK..ZANABAZAR SQUARE CLOSING DOUBLE-LINED HEAD MARK +11A47 ; Zanabazar_Square # Mn ZANABAZAR SQUARE SUBJOINER + +# Total code points: 72 + +# ================================================ + +11800..1182B ; Dogra # Lo [44] DOGRA LETTER A..DOGRA LETTER RRA +1182C..1182E ; Dogra # Mc [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II +1182F..11837 ; Dogra # Mn [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA +11838 ; Dogra # Mc DOGRA SIGN VISARGA +11839..1183A ; Dogra # Mn [2] DOGRA SIGN VIRAMA..DOGRA SIGN NUKTA +1183B ; Dogra # Po DOGRA ABBREVIATION SIGN + +# Total code points: 60 + +# ================================================ + +11D60..11D65 ; Gunjala_Gondi # Lo [6] GUNJALA GONDI LETTER A..GUNJALA GONDI LETTER UU +11D67..11D68 ; Gunjala_Gondi # Lo [2] GUNJALA GONDI LETTER EE..GUNJALA GONDI LETTER AI +11D6A..11D89 ; Gunjala_Gondi # Lo [32] GUNJALA GONDI LETTER OO..GUNJALA GONDI LETTER SA +11D8A..11D8E ; Gunjala_Gondi # Mc [5] GUNJALA GONDI VOWEL SIGN AA..GUNJALA GONDI VOWEL SIGN UU +11D90..11D91 ; Gunjala_Gondi # Mn [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI +11D93..11D94 ; Gunjala_Gondi # Mc [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU +11D95 ; Gunjala_Gondi # Mn GUNJALA GONDI SIGN ANUSVARA +11D96 ; Gunjala_Gondi # Mc GUNJALA GONDI SIGN VISARGA +11D97 ; Gunjala_Gondi # Mn GUNJALA GONDI VIRAMA +11D98 ; Gunjala_Gondi # Lo GUNJALA GONDI OM +11DA0..11DA9 ; Gunjala_Gondi # Nd [10] GUNJALA GONDI DIGIT ZERO..GUNJALA GONDI DIGIT NINE + +# Total code points: 63 + +# ================================================ + +11EE0..11EF2 ; Makasar # Lo [19] MAKASAR LETTER KA..MAKASAR ANGKA +11EF3..11EF4 ; Makasar # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U +11EF5..11EF6 ; Makasar # Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O +11EF7..11EF8 ; Makasar # Po [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION + +# Total code points: 25 + +# ================================================ + +16E40..16E7F ; Medefaidrin # L& [64] MEDEFAIDRIN CAPITAL LETTER M..MEDEFAIDRIN SMALL LETTER Y +16E80..16E96 ; Medefaidrin # No [23] MEDEFAIDRIN DIGIT ZERO..MEDEFAIDRIN DIGIT THREE ALTERNATE FORM +16E97..16E9A ; Medefaidrin # Po [4] MEDEFAIDRIN COMMA..MEDEFAIDRIN EXCLAMATION OH + +# Total code points: 91 + +# ================================================ + +10D00..10D23 ; Hanifi_Rohingya # Lo [36] HANIFI ROHINGYA LETTER A..HANIFI ROHINGYA MARK NA KHONNA +10D24..10D27 ; Hanifi_Rohingya # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI +10D30..10D39 ; Hanifi_Rohingya # Nd [10] HANIFI ROHINGYA DIGIT ZERO..HANIFI ROHINGYA DIGIT NINE + +# Total code points: 50 + +# ================================================ + +10F30..10F45 ; Sogdian # Lo [22] SOGDIAN LETTER ALEPH..SOGDIAN INDEPENDENT SHIN +10F46..10F50 ; Sogdian # Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW +10F51..10F54 ; Sogdian # No [4] SOGDIAN NUMBER ONE..SOGDIAN NUMBER ONE HUNDRED +10F55..10F59 ; Sogdian # Po [5] SOGDIAN PUNCTUATION TWO VERTICAL BARS..SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT + +# Total code points: 42 + +# ================================================ + +10F00..10F1C ; Old_Sogdian # Lo [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL +10F1D..10F26 ; Old_Sogdian # No [10] OLD SOGDIAN NUMBER ONE..OLD SOGDIAN FRACTION ONE HALF +10F27 ; Old_Sogdian # Lo OLD SOGDIAN LIGATURE AYIN-DALETH + +# Total code points: 40 + +# ================================================ + +10FE0..10FF6 ; Elymaic # Lo [23] ELYMAIC LETTER ALEPH..ELYMAIC LIGATURE ZAYIN-YODH + +# Total code points: 23 + +# ================================================ + +119A0..119A7 ; Nandinagari # Lo [8] NANDINAGARI LETTER A..NANDINAGARI LETTER VOCALIC RR +119AA..119D0 ; Nandinagari # Lo [39] NANDINAGARI LETTER E..NANDINAGARI LETTER RRA +119D1..119D3 ; Nandinagari # Mc [3] NANDINAGARI VOWEL SIGN AA..NANDINAGARI VOWEL SIGN II +119D4..119D7 ; Nandinagari # Mn [4] NANDINAGARI VOWEL SIGN U..NANDINAGARI VOWEL SIGN VOCALIC RR +119DA..119DB ; Nandinagari # Mn [2] NANDINAGARI VOWEL SIGN E..NANDINAGARI VOWEL SIGN AI +119DC..119DF ; Nandinagari # Mc [4] NANDINAGARI VOWEL SIGN O..NANDINAGARI SIGN VISARGA +119E0 ; Nandinagari # Mn NANDINAGARI SIGN VIRAMA +119E1 ; Nandinagari # Lo NANDINAGARI SIGN AVAGRAHA +119E2 ; Nandinagari # Po NANDINAGARI SIGN SIDDHAM +119E3 ; Nandinagari # Lo NANDINAGARI HEADSTROKE +119E4 ; Nandinagari # Mc NANDINAGARI VOWEL SIGN PRISHTHAMATRA E + +# Total code points: 65 + +# ================================================ + +1E100..1E12C ; Nyiakeng_Puachue_Hmong # Lo [45] NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W +1E130..1E136 ; Nyiakeng_Puachue_Hmong # Mn [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D +1E137..1E13D ; Nyiakeng_Puachue_Hmong # Lm [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER +1E140..1E149 ; Nyiakeng_Puachue_Hmong # Nd [10] NYIAKENG PUACHUE HMONG DIGIT ZERO..NYIAKENG PUACHUE HMONG DIGIT NINE +1E14E ; Nyiakeng_Puachue_Hmong # Lo NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ +1E14F ; Nyiakeng_Puachue_Hmong # So NYIAKENG PUACHUE HMONG CIRCLED CA + +# Total code points: 71 + +# ================================================ + +1E2C0..1E2EB ; Wancho # Lo [44] WANCHO LETTER AA..WANCHO LETTER YIH +1E2EC..1E2EF ; Wancho # Mn [4] WANCHO TONE TUP..WANCHO TONE KOINI +1E2F0..1E2F9 ; Wancho # Nd [10] WANCHO DIGIT ZERO..WANCHO DIGIT NINE +1E2FF ; Wancho # Sc WANCHO NGUN SIGN + +# Total code points: 59 + +# ================================================ + +10FB0..10FC4 ; Chorasmian # Lo [21] CHORASMIAN LETTER ALEPH..CHORASMIAN LETTER TAW +10FC5..10FCB ; Chorasmian # No [7] CHORASMIAN NUMBER ONE..CHORASMIAN NUMBER ONE HUNDRED + +# Total code points: 28 + +# ================================================ + +11900..11906 ; Dives_Akuru # Lo [7] DIVES AKURU LETTER A..DIVES AKURU LETTER E +11909 ; Dives_Akuru # Lo DIVES AKURU LETTER O +1190C..11913 ; Dives_Akuru # Lo [8] DIVES AKURU LETTER KA..DIVES AKURU LETTER JA +11915..11916 ; Dives_Akuru # Lo [2] DIVES AKURU LETTER NYA..DIVES AKURU LETTER TTA +11918..1192F ; Dives_Akuru # Lo [24] DIVES AKURU LETTER DDA..DIVES AKURU LETTER ZA +11930..11935 ; Dives_Akuru # Mc [6] DIVES AKURU VOWEL SIGN AA..DIVES AKURU VOWEL SIGN E +11937..11938 ; Dives_Akuru # Mc [2] DIVES AKURU VOWEL SIGN AI..DIVES AKURU VOWEL SIGN O +1193B..1193C ; Dives_Akuru # Mn [2] DIVES AKURU SIGN ANUSVARA..DIVES AKURU SIGN CANDRABINDU +1193D ; Dives_Akuru # Mc DIVES AKURU SIGN HALANTA +1193E ; Dives_Akuru # Mn DIVES AKURU VIRAMA +1193F ; Dives_Akuru # Lo DIVES AKURU PREFIXED NASAL SIGN +11940 ; Dives_Akuru # Mc DIVES AKURU MEDIAL YA +11941 ; Dives_Akuru # Lo DIVES AKURU INITIAL RA +11942 ; Dives_Akuru # Mc DIVES AKURU MEDIAL RA +11943 ; Dives_Akuru # Mn DIVES AKURU SIGN NUKTA +11944..11946 ; Dives_Akuru # Po [3] DIVES AKURU DOUBLE DANDA..DIVES AKURU END OF TEXT MARK +11950..11959 ; Dives_Akuru # Nd [10] DIVES AKURU DIGIT ZERO..DIVES AKURU DIGIT NINE + +# Total code points: 72 + +# ================================================ + +16FE4 ; Khitan_Small_Script # Mn KHITAN SMALL SCRIPT FILLER +18B00..18CD5 ; Khitan_Small_Script # Lo [470] KHITAN SMALL SCRIPT CHARACTER-18B00..KHITAN SMALL SCRIPT CHARACTER-18CD5 + +# Total code points: 471 + +# ================================================ + +10E80..10EA9 ; Yezidi # Lo [42] YEZIDI LETTER ELIF..YEZIDI LETTER ET +10EAB..10EAC ; Yezidi # Mn [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK +10EAD ; Yezidi # Pd YEZIDI HYPHENATION MARK +10EB0..10EB1 ; Yezidi # Lo [2] YEZIDI LETTER LAM WITH DOT ABOVE..YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE + +# Total code points: 47 + +# ================================================ + +12F90..12FF0 ; Cypro_Minoan # Lo [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114 +12FF1..12FF2 ; Cypro_Minoan # Po [2] CYPRO-MINOAN SIGN CM301..CYPRO-MINOAN SIGN CM302 + +# Total code points: 99 + +# ================================================ + +10F70..10F81 ; Old_Uyghur # Lo [18] OLD UYGHUR LETTER ALEPH..OLD UYGHUR LETTER LESH +10F82..10F85 ; Old_Uyghur # Mn [4] OLD UYGHUR COMBINING DOT ABOVE..OLD UYGHUR COMBINING TWO DOTS BELOW +10F86..10F89 ; Old_Uyghur # Po [4] OLD UYGHUR PUNCTUATION BAR..OLD UYGHUR PUNCTUATION FOUR DOTS + +# Total code points: 26 + +# ================================================ + +16A70..16ABE ; Tangsa # Lo [79] TANGSA LETTER OZ..TANGSA LETTER ZA +16AC0..16AC9 ; Tangsa # Nd [10] TANGSA DIGIT ZERO..TANGSA DIGIT NINE + +# Total code points: 89 + +# ================================================ + +1E290..1E2AD ; Toto # Lo [30] TOTO LETTER PA..TOTO LETTER A +1E2AE ; Toto # Mn TOTO SIGN RISING TONE + +# Total code points: 31 + +# ================================================ + +10570..1057A ; Vithkuqi # L& [11] VITHKUQI CAPITAL LETTER A..VITHKUQI CAPITAL LETTER GA +1057C..1058A ; Vithkuqi # L& [15] VITHKUQI CAPITAL LETTER HA..VITHKUQI CAPITAL LETTER RE +1058C..10592 ; Vithkuqi # L& [7] VITHKUQI CAPITAL LETTER SE..VITHKUQI CAPITAL LETTER XE +10594..10595 ; Vithkuqi # L& [2] VITHKUQI CAPITAL LETTER Y..VITHKUQI CAPITAL LETTER ZE +10597..105A1 ; Vithkuqi # L& [11] VITHKUQI SMALL LETTER A..VITHKUQI SMALL LETTER GA +105A3..105B1 ; Vithkuqi # L& [15] VITHKUQI SMALL LETTER HA..VITHKUQI SMALL LETTER RE +105B3..105B9 ; Vithkuqi # L& [7] VITHKUQI SMALL LETTER SE..VITHKUQI SMALL LETTER XE +105BB..105BC ; Vithkuqi # L& [2] VITHKUQI SMALL LETTER Y..VITHKUQI SMALL LETTER ZE + +# Total code points: 70 + +# ================================================ + +11F00..11F01 ; Kawi # Mn [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA +11F02 ; Kawi # Lo KAWI SIGN REPHA +11F03 ; Kawi # Mc KAWI SIGN VISARGA +11F04..11F10 ; Kawi # Lo [13] KAWI LETTER A..KAWI LETTER O +11F12..11F33 ; Kawi # Lo [34] KAWI LETTER KA..KAWI LETTER JNYA +11F34..11F35 ; Kawi # Mc [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA +11F36..11F3A ; Kawi # Mn [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R +11F3E..11F3F ; Kawi # Mc [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI +11F40 ; Kawi # Mn KAWI VOWEL SIGN EU +11F41 ; Kawi # Mc KAWI SIGN KILLER +11F42 ; Kawi # Mn KAWI CONJOINER +11F43..11F4F ; Kawi # Po [13] KAWI DANDA..KAWI PUNCTUATION CLOSING SPIRAL +11F50..11F59 ; Kawi # Nd [10] KAWI DIGIT ZERO..KAWI DIGIT NINE + +# Total code points: 86 + +# ================================================ + +1E4D0..1E4EA ; Nag_Mundari # Lo [27] NAG MUNDARI LETTER O..NAG MUNDARI LETTER ELL +1E4EB ; Nag_Mundari # Lm NAG MUNDARI SIGN OJOD +1E4EC..1E4EF ; Nag_Mundari # Mn [4] NAG MUNDARI SIGN MUHOR..NAG MUNDARI SIGN SUTUH +1E4F0..1E4F9 ; Nag_Mundari # Nd [10] NAG MUNDARI DIGIT ZERO..NAG MUNDARI DIGIT NINE + +# Total code points: 42 + +# EOF diff --git a/library/src/main/java/com/tom_roush/fontbox/afm/AFMParser.java b/library/src/main/java/com/tom_roush/fontbox/afm/AFMParser.java index c4795e4e5..625de5a0c 100644 --- a/library/src/main/java/com/tom_roush/fontbox/afm/AFMParser.java +++ b/library/src/main/java/com/tom_roush/fontbox/afm/AFMParser.java @@ -20,11 +20,11 @@ import java.io.InputStream; import java.util.ArrayList; import java.util.List; +import java.util.NoSuchElementException; import java.util.StringTokenizer; import com.tom_roush.fontbox.util.BoundingBox; import com.tom_roush.fontbox.util.Charsets; - /** * This class is used to parse AFM(Adobe Font Metrics) documents. * @@ -310,7 +310,7 @@ public AFMParser( InputStream in ) */ public FontMetrics parse() throws IOException { - return parseFontMetric(false); + return parse(false); } /** @@ -324,8 +324,16 @@ public FontMetrics parse() throws IOException */ public FontMetrics parse(boolean reducedDataset) throws IOException { - return parseFontMetric(reducedDataset); + try + { + return parseFontMetric(reducedDataset); + } + catch (NoSuchElementException ex) + { + throw new IOException(ex); + } } + /** * This will parse a font metrics item. * @@ -340,7 +348,7 @@ private FontMetrics parseFontMetric(boolean reducedDataset) throws IOException if( !START_FONT_METRICS.equals( startFontMetrics ) ) { throw new IOException( "Error: The AFM file should start with " + START_FONT_METRICS + - " and not '" + startFontMetrics + "'" ); + " and not '" + startFontMetrics + "'" ); } fontMetrics.setAFMVersion( readFloat() ); String nextCommand; @@ -479,7 +487,7 @@ else if( START_CHAR_METRICS.equals( nextCommand ) ) if( !end.equals( END_CHAR_METRICS ) ) { throw new IOException( "Error: Expected '" + END_CHAR_METRICS + "' actual '" + - end + "'" ); + end + "'" ); } charMetricsRead = true; fontMetrics.setCharMetrics(charMetrics); @@ -496,7 +504,7 @@ else if( !reducedDataset && START_COMPOSITES.equals( nextCommand ) ) if( !end.equals( END_COMPOSITES ) ) { throw new IOException( "Error: Expected '" + END_COMPOSITES + "' actual '" + - end + "'" ); + end + "'" ); } } else if( !reducedDataset && START_KERN_DATA.equals( nextCommand ) ) @@ -544,7 +552,7 @@ private void parseKernData( FontMetrics fontMetrics ) throws IOException if( !end.equals( END_TRACK_KERN ) ) { throw new IOException( "Error: Expected '" + END_TRACK_KERN + "' actual '" + - end + "'" ); + end + "'" ); } } else if( START_KERN_PAIRS.equals( nextCommand ) ) @@ -559,7 +567,7 @@ else if( START_KERN_PAIRS.equals( nextCommand ) ) if( !end.equals( END_KERN_PAIRS ) ) { throw new IOException( "Error: Expected '" + END_KERN_PAIRS + "' actual '" + - end + "'" ); + end + "'" ); } } else if( START_KERN_PAIRS0.equals( nextCommand ) ) @@ -574,7 +582,7 @@ else if( START_KERN_PAIRS0.equals( nextCommand ) ) if( !end.equals( END_KERN_PAIRS ) ) { throw new IOException( "Error: Expected '" + END_KERN_PAIRS + "' actual '" + - end + "'" ); + end + "'" ); } } else if( START_KERN_PAIRS1.equals( nextCommand ) ) @@ -589,7 +597,7 @@ else if( START_KERN_PAIRS1.equals( nextCommand ) ) if( !end.equals( END_KERN_PAIRS ) ) { throw new IOException( "Error: Expected '" + END_KERN_PAIRS + "' actual '" + - end + "'" ); + end + "'" ); } } else @@ -757,12 +765,41 @@ private CharMetric parseCharMetric() throws IOException while( metricsTokenizer.hasMoreTokens() ) { String nextCommand = metricsTokenizer.nextToken(); + // top 5 most used first if( nextCommand.equals( CHARMETRICS_C ) ) { String charCode = metricsTokenizer.nextToken(); charMetric.setCharacterCode( Integer.parseInt( charCode ) ); verifySemicolon( metricsTokenizer ); } + else if( nextCommand.equals( CHARMETRICS_WX ) ) + { + charMetric.setWx(Float.parseFloat(metricsTokenizer.nextToken())); + verifySemicolon( metricsTokenizer ); + } + else if( nextCommand.equals( CHARMETRICS_N ) ) + { + charMetric.setName(metricsTokenizer.nextToken()); + verifySemicolon( metricsTokenizer ); + } + else if( nextCommand.equals( CHARMETRICS_B ) ) + { + BoundingBox box = new BoundingBox(); + box.setLowerLeftX(Float.parseFloat(metricsTokenizer.nextToken())); + box.setLowerLeftY(Float.parseFloat(metricsTokenizer.nextToken())); + box.setUpperRightX(Float.parseFloat(metricsTokenizer.nextToken())); + box.setUpperRightY(Float.parseFloat(metricsTokenizer.nextToken())); + charMetric.setBoundingBox( box ); + verifySemicolon( metricsTokenizer ); + } + else if( nextCommand.equals( CHARMETRICS_L ) ) + { + Ligature lig = new Ligature(); + lig.setSuccessor(metricsTokenizer.nextToken()); + lig.setLigature(metricsTokenizer.nextToken()); + charMetric.addLigature( lig ); + verifySemicolon( metricsTokenizer ); + } else if( nextCommand.equals( CHARMETRICS_CH ) ) { //Is the hex string or FF, the spec is a little @@ -771,11 +808,6 @@ else if( nextCommand.equals( CHARMETRICS_CH ) ) charMetric.setCharacterCode( Integer.parseInt( charCode, BITS_IN_HEX ) ); verifySemicolon( metricsTokenizer ); } - else if( nextCommand.equals( CHARMETRICS_WX ) ) - { - charMetric.setWx(Float.parseFloat(metricsTokenizer.nextToken())); - verifySemicolon( metricsTokenizer ); - } else if( nextCommand.equals( CHARMETRICS_W0X ) ) { charMetric.setW0x(Float.parseFloat(metricsTokenizer.nextToken())); @@ -833,29 +865,6 @@ else if( nextCommand.equals( CHARMETRICS_VV ) ) charMetric.setVv( vv ); verifySemicolon( metricsTokenizer ); } - else if( nextCommand.equals( CHARMETRICS_N ) ) - { - charMetric.setName(metricsTokenizer.nextToken()); - verifySemicolon( metricsTokenizer ); - } - else if( nextCommand.equals( CHARMETRICS_B ) ) - { - BoundingBox box = new BoundingBox(); - box.setLowerLeftX(Float.parseFloat(metricsTokenizer.nextToken())); - box.setLowerLeftY(Float.parseFloat(metricsTokenizer.nextToken())); - box.setUpperRightX(Float.parseFloat(metricsTokenizer.nextToken())); - box.setUpperRightY(Float.parseFloat(metricsTokenizer.nextToken())); - charMetric.setBoundingBox( box ); - verifySemicolon( metricsTokenizer ); - } - else if( nextCommand.equals( CHARMETRICS_L ) ) - { - Ligature lig = new Ligature(); - lig.setSuccessor(metricsTokenizer.nextToken()); - lig.setLigature(metricsTokenizer.nextToken()); - charMetric.addLigature( lig ); - verifySemicolon( metricsTokenizer ); - } else { throw new IOException( "Unknown CharMetrics command '" + nextCommand + "'" ); @@ -884,7 +893,7 @@ private void verifySemicolon( StringTokenizer tokenizer ) throws IOException if (!";".equals(semicolon)) { throw new IOException( "Error: Expected semicolon in stream actual='" + - semicolon + "'" ); + semicolon + "'" ); } } else @@ -996,10 +1005,9 @@ private String readString() throws IOException * * @return true If the character is whitespace as defined by the AFM spec. */ - private boolean isEOL( int character ) + private static boolean isEOL( int character ) { - return character == 0x0D || - character == 0x0A; + return character == 0x0D || character == 0x0A; } /** @@ -1009,11 +1017,17 @@ private boolean isEOL( int character ) * * @return true If the character is whitespace as defined by the AFM spec. */ - private boolean isWhitespace( int character ) + private static boolean isWhitespace( int character ) { - return character == ' ' || - character == '\t' || - character == 0x0D || - character == 0x0A; + switch (character) + { + case ' ': + case '\t': + case 0x0D: + case 0x0A: + return true; + default: + return false; + } } } diff --git a/library/src/main/java/com/tom_roush/fontbox/cff/CFFCIDFont.java b/library/src/main/java/com/tom_roush/fontbox/cff/CFFCIDFont.java index 86baa78b7..5661d19f1 100644 --- a/library/src/main/java/com/tom_roush/fontbox/cff/CFFCIDFont.java +++ b/library/src/main/java/com/tom_roush/fontbox/cff/CFFCIDFont.java @@ -20,13 +20,12 @@ import android.graphics.Path; import java.io.IOException; -import java.util.LinkedList; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import com.tom_roush.fontbox.type1.Type1CharStringReader; - /** * A Type 0 CIDFont represented in a CFF file. Thread safe. * @@ -39,12 +38,12 @@ public class CFFCIDFont extends CFFFont private String ordering; private int supplement; - private List> fontDictionaries = new LinkedList>(); - private List> privateDictionaries = new LinkedList>(); + private List> fontDictionaries = Collections.emptyList(); + private List> privateDictionaries = Collections.emptyList(); private FDSelect fdSelect; private final Map charStringCache = - new ConcurrentHashMap(); + new ConcurrentHashMap(); private final PrivateType1CharStringReader reader = new PrivateType1CharStringReader(); @@ -175,12 +174,12 @@ void setFdSelect(FDSelect fdSelect) private int getDefaultWidthX(int gid) { int fdArrayIndex = this.fdSelect.getFDIndex(gid); - if (fdArrayIndex == -1) + if (fdArrayIndex == -1 || fdArrayIndex >= this.privateDictionaries.size()) { return 1000; } - Map privDict = this.privateDictionaries.get(fdArrayIndex); - return privDict.containsKey("defaultWidthX") ? ((Number)privDict.get("defaultWidthX")).intValue() : 1000; + Object privDictValue = this.privateDictionaries.get(fdArrayIndex).get("defaultWidthX"); + return privDictValue instanceof Number ? ((Number) privDictValue).intValue() : 1000; } /** @@ -191,12 +190,12 @@ private int getDefaultWidthX(int gid) private int getNominalWidthX(int gid) { int fdArrayIndex = this.fdSelect.getFDIndex(gid); - if (fdArrayIndex == -1) + if (fdArrayIndex == -1 || fdArrayIndex >= this.privateDictionaries.size()) { return 0; } - Map privDict = this.privateDictionaries.get(fdArrayIndex); - return privDict.containsKey("nominalWidthX") ? ((Number)privDict.get("nominalWidthX")).intValue() : 0; + Object privDictValue = this.privateDictionaries.get(fdArrayIndex).get("nominalWidthX"); + return privDictValue instanceof Number ? ((Number) privDictValue).intValue() : 0; } /** @@ -207,7 +206,7 @@ private int getNominalWidthX(int gid) private byte[][] getLocalSubrIndex(int gid) { int fdArrayIndex = this.fdSelect.getFDIndex(gid); - if (fdArrayIndex == -1) + if (fdArrayIndex == -1 || fdArrayIndex >= this.privateDictionaries.size()) { return null; } @@ -237,7 +236,7 @@ public CIDKeyedType2CharString getType2CharString(int cid) throws IOException Type2CharStringParser parser = new Type2CharStringParser(fontName, cid); List type2seq = parser.parse(bytes, globalSubrIndex, getLocalSubrIndex(gid)); type2 = new CIDKeyedType2CharString(reader, fontName, cid, gid, type2seq, - getDefaultWidthX(gid), getNominalWidthX(gid)); + getDefaultWidthX(gid), getNominalWidthX(gid)); charStringCache.put(cid, type2); } return type2; diff --git a/library/src/main/java/com/tom_roush/fontbox/cff/CFFParser.java b/library/src/main/java/com/tom_roush/fontbox/cff/CFFParser.java index c4bf61012..7a0db5dae 100644 --- a/library/src/main/java/com/tom_roush/fontbox/cff/CFFParser.java +++ b/library/src/main/java/com/tom_roush/fontbox/cff/CFFParser.java @@ -28,9 +28,8 @@ import java.util.Map; import com.tom_roush.fontbox.util.Charsets; - /** - * This class represents a parser for a CFF font. + * This class represents a parser for a CFF font. * @author Villu Ruusmann */ public class CFFParser @@ -223,8 +222,8 @@ private static String[] readStringIndexData(CFFDataInput input) throws IOExcepti if (length < 0) { throw new IOException("Negative index data length + " + length + " at " + - i + ": offsets[" + (i + 1) + "]=" + offsets[i + 1] + - ", offsets[" + i + "]=" + offsets[i]); + i + ": offsets[" + (i + 1) + "]=" + offsets[i + 1] + + ", offsets[" + i + "]=" + offsets[i]); } indexDataValues[i] = new String(input.readBytes(length), Charsets.ISO_8859_1); } @@ -346,53 +345,53 @@ private static Double readRealNumber(CFFDataInput input) throws IOException { switch (nibble) { - case 0x0: - case 0x1: - case 0x2: - case 0x3: - case 0x4: - case 0x5: - case 0x6: - case 0x7: - case 0x8: - case 0x9: - sb.append(nibble); - exponentMissing = false; - break; - case 0xa: - sb.append("."); - break; - case 0xb: - if (hasExponent) - { - Log.w("PdfBox-Android", "duplicate 'E' ignored after " + sb); - break; - } - sb.append("E"); - exponentMissing = true; - hasExponent = true; - break; - case 0xc: - if (hasExponent) - { - Log.w("PdfBox-Android", "duplicate 'E-' ignored after " + sb); - break; - } - sb.append("E-"); - exponentMissing = true; - hasExponent = true; - break; - case 0xd: - break; - case 0xe: - sb.append("-"); + case 0x0: + case 0x1: + case 0x2: + case 0x3: + case 0x4: + case 0x5: + case 0x6: + case 0x7: + case 0x8: + case 0x9: + sb.append(nibble); + exponentMissing = false; + break; + case 0xa: + sb.append('.'); + break; + case 0xb: + if (hasExponent) + { + Log.w("PdfBox-Android", "duplicate 'E' ignored after " + sb); break; - case 0xf: - done = true; + } + sb.append('E'); + exponentMissing = true; + hasExponent = true; + break; + case 0xc: + if (hasExponent) + { + Log.w("PdfBox-Android", "duplicate 'E-' ignored after " + sb); break; - default: - // can only be a programming error because a nibble is between 0 and F - throw new IllegalArgumentException("illegal nibble " + nibble); + } + sb.append("E-"); + exponentMissing = true; + hasExponent = true; + break; + case 0xd: + break; + case 0xe: + sb.append('-'); + break; + case 0xf: + done = true; + break; + default: + // can only be a programming error because a nibble is between 0 and F + throw new IllegalArgumentException("illegal nibble " + nibble); } } } @@ -401,7 +400,7 @@ private static Double readRealNumber(CFFDataInput input) throws IOException // the exponent is missing, just append "0" to avoid an exception // not sure if 0 is the correct value, but it seems to fit // see PDFBOX-1522 - sb.append("0"); + sb.append('0'); } if (sb.length() == 0) { @@ -470,11 +469,11 @@ private CFFFont parseFont(CFFDataInput input, String name, byte[] topDictIndex) font.addValueToTopDict("PaintType", topDict.getNumber("PaintType", 0)); font.addValueToTopDict("CharstringType", topDict.getNumber("CharstringType", 2)); font.addValueToTopDict("FontMatrix", topDict.getArray("FontMatrix", Arrays.asList( - 0.001, (double) 0, (double) 0, 0.001, - (double) 0, (double) 0))); + 0.001, (double) 0, (double) 0, 0.001, + (double) 0, (double) 0))); font.addValueToTopDict("UniqueID", topDict.getNumber("UniqueID", null)); font.addValueToTopDict("FontBBox", topDict.getArray("FontBBox", - Arrays. asList(0, 0, 0, 0))); + Arrays. asList(0, 0, 0, 0))); font.addValueToTopDict("StrokeWidth", topDict.getNumber("StrokeWidth", 0)); font.addValueToTopDict("XUID", topDict.getArray("XUID", null)); @@ -556,8 +555,8 @@ else if (!isCIDFont && charsetId == 2) { // default font.addValueToTopDict("FontMatrix", topDict.getArray("FontMatrix", - Arrays.asList(0.001, (double) 0, (double) 0, 0.001, - (double) 0, (double) 0))); + Arrays.asList(0.001, (double) 0, (double) 0, 0.001, + (double) 0, (double) 0))); } } else if (privMatrix != null) @@ -609,7 +608,7 @@ private void concatenateMatrix(List matrixDest, List matrixConca * Parse dictionaries specific to a CIDFont. */ private void parseCIDFontDicts(CFFDataInput input, DictData topDict, CFFCIDFont font, int nrOfcharStrings) - throws IOException + throws IOException { // In a CIDKeyed Font, the Private dictionary isn't in the Top Dict but in the Font dict // which can be accessed by a lookup using FDArray and FDSelect @@ -631,18 +630,12 @@ private void parseCIDFontDicts(CFFDataInput input, DictData topDict, CFFCIDFont List> privateDictionaries = new LinkedList>(); List> fontDictionaries = new LinkedList>(); + boolean privateDictPopulated = false; for (byte[] bytes : fdIndex) { CFFDataInput fontDictInput = new CFFDataInput(bytes); DictData fontDict = readDictData(fontDictInput); - // read private dict - DictData.Entry privateEntry = fontDict.getEntry("Private"); - if (privateEntry == null || privateEntry.size() < 2) - { - throw new IOException("Font DICT invalid without \"Private\" entry"); - } - // font dict Map fontDictMap = new LinkedHashMap(4); fontDictMap.put("FontName", getString(fontDict, "FontName")); @@ -652,12 +645,23 @@ private void parseCIDFontDicts(CFFDataInput input, DictData topDict, CFFCIDFont // TODO OD-4 : Add here other keys fontDictionaries.add(fontDictMap); + // read private dict + DictData.Entry privateEntry = fontDict.getEntry("Private"); + if (privateEntry == null || privateEntry.size() < 2) + { + // PDFBOX-5843 don't abort here, and don't skip empty bytes entries, because + // getLocalSubrIndex() expects subr at a specific index + privateDictionaries.add(new HashMap()); + continue; + } + int privateOffset = privateEntry.getNumber(1).intValue(); input.setPosition(privateOffset); int privateSize = privateEntry.getNumber(0).intValue(); DictData privateDict = readDictData(input, privateSize); // populate private dict + privateDictPopulated = true; Map privDict = readPrivateDict(privateDict); privateDictionaries.add(privDict); @@ -670,6 +674,11 @@ private void parseCIDFontDicts(CFFDataInput input, DictData topDict, CFFCIDFont } } + if (!privateDictPopulated) + { + throw new IOException("Font DICT invalid without \"Private\" entry"); + } + // font-dict (FD) select DictData.Entry fdSelectEntry = topDict.getEntry("FDSelect"); if (fdSelectEntry == null || !fdSelectEntry.hasOperands()) @@ -716,13 +725,13 @@ private Map readPrivateDict(DictData privateDict) * Parse dictionaries specific to a Type 1-equivalent font. */ private void parseType1Dicts(CFFDataInput input, DictData topDict, CFFType1Font font, CFFCharset charset) - throws IOException + throws IOException { // encoding DictData.Entry encodingEntry = topDict.getEntry("Encoding"); CFFEncoding encoding; int encodingId = encodingEntry != null && encodingEntry.hasOperands() ? - encodingEntry.getNumber(0).intValue() : 0; + encodingEntry.getNumber(0).intValue() : 0; switch (encodingId) { case 0: @@ -806,7 +815,7 @@ private CFFEncoding readEncoding(CFFDataInput dataInput, CFFCharset charset) thr } private Format0Encoding readFormat0Encoding(CFFDataInput dataInput, CFFCharset charset, - int format) throws IOException + int format) throws IOException { Format0Encoding encoding = new Format0Encoding(); encoding.format = format; @@ -826,7 +835,7 @@ private Format0Encoding readFormat0Encoding(CFFDataInput dataInput, CFFCharset c } private Format1Encoding readFormat1Encoding(CFFDataInput dataInput, CFFCharset charset, - int format) throws IOException + int format) throws IOException { Format1Encoding encoding = new Format1Encoding(); encoding.format = format; @@ -899,7 +908,7 @@ private static FDSelect readFDSelect(CFFDataInput dataInput, int nGlyphs, CFFCID * @throws IOException */ private static Format0FDSelect readFormat0FDSelect(CFFDataInput dataInput, int format, int nGlyphs, CFFCIDFont ros) - throws IOException + throws IOException { Format0FDSelect fdselect = new Format0FDSelect(ros); fdselect.format = format; @@ -922,7 +931,7 @@ private static Format0FDSelect readFormat0FDSelect(CFFDataInput dataInput, int f * @throws IOException */ private static Format3FDSelect readFormat3FDSelect(CFFDataInput dataInput, int format, int nGlyphs, CFFCIDFont ros) - throws IOException + throws IOException { Format3FDSelect fdselect = new Format3FDSelect(ros); fdselect.format = format; @@ -990,7 +999,7 @@ public int getFDIndex(int gid) public String toString() { return getClass().getName() + "[format=" + format + " nbRanges=" + nbRanges + ", range3=" - + Arrays.toString(range3) + " sentinel=" + sentinel + "]"; + + Arrays.toString(range3) + " sentinel=" + sentinel + "]"; } } @@ -1041,7 +1050,7 @@ public String toString() } private CFFCharset readCharset(CFFDataInput dataInput, int nGlyphs, boolean isCIDFont) - throws IOException + throws IOException { int format = dataInput.readCard8(); switch (format) @@ -1058,7 +1067,7 @@ private CFFCharset readCharset(CFFDataInput dataInput, int nGlyphs, boolean isCI } private Format0Charset readFormat0Charset(CFFDataInput dataInput, int format, int nGlyphs, - boolean isCIDFont) throws IOException + boolean isCIDFont) throws IOException { Format0Charset charset = new Format0Charset(isCIDFont); charset.format = format; @@ -1087,7 +1096,7 @@ private Format0Charset readFormat0Charset(CFFDataInput dataInput, int format, in } private Format1Charset readFormat1Charset(CFFDataInput dataInput, int format, int nGlyphs, - boolean isCIDFont) throws IOException + boolean isCIDFont) throws IOException { Format1Charset charset = new Format1Charset(isCIDFont); charset.format = format; @@ -1123,7 +1132,7 @@ private Format1Charset readFormat1Charset(CFFDataInput dataInput, int format, in } private Format2Charset readFormat2Charset(CFFDataInput dataInput, int format, int nGlyphs, - boolean isCIDFont) throws IOException + boolean isCIDFont) throws IOException { Format2Charset charset = new Format2Charset(isCIDFont); charset.format = format; @@ -1159,7 +1168,7 @@ private Format2Charset readFormat2Charset(CFFDataInput dataInput, int format, in } /** - * Inner class holding the header of a CFF font. + * Inner class holding the header of a CFF font. */ private static class Header { @@ -1172,12 +1181,12 @@ private static class Header public String toString() { return getClass().getName() + "[major=" + major + ", minor=" + minor + ", hdrSize=" + hdrSize - + ", offSize=" + offSize + "]"; + + ", offSize=" + offSize + "]"; } } /** - * Inner class holding the DictData of a CFF font. + * Inner class holding the DictData of a CFF font. */ private static class DictData { @@ -1230,7 +1239,7 @@ public String toString() } /** - * Inner class holding an operand of a CFF font. + * Inner class holding an operand of a CFF font. */ private static class Entry { @@ -1304,7 +1313,7 @@ public String toString() } /** - * Inner class representing a font's built-in CFF encoding. + * Inner class representing a font's built-in CFF encoding. */ abstract static class CFFBuiltInEncoding extends CFFEncoding { @@ -1312,7 +1321,7 @@ abstract static class CFFBuiltInEncoding extends CFFEncoding private Supplement[] supplement; /** - * Inner class representing a supplement for an encoding. + * Inner class representing a supplement for an encoding. */ static class Supplement { @@ -1344,7 +1353,7 @@ public String toString() } /** - * Inner class representing a Format0 encoding. + * Inner class representing a Format0 encoding. */ private static class Format0Encoding extends CFFBuiltInEncoding { @@ -1355,12 +1364,12 @@ private static class Format0Encoding extends CFFBuiltInEncoding public String toString() { return getClass().getName() + "[format=" + format + ", nCodes=" + nCodes - + ", supplement=" + Arrays.toString(super.supplement) + "]"; + + ", supplement=" + Arrays.toString(super.supplement) + "]"; } } /** - * Inner class representing a Format1 encoding. + * Inner class representing a Format1 encoding. */ private static class Format1Encoding extends CFFBuiltInEncoding { @@ -1371,7 +1380,7 @@ private static class Format1Encoding extends CFFBuiltInEncoding public String toString() { return getClass().getName() + "[format=" + format + ", nRanges=" + nRanges - + ", supplement=" + Arrays.toString(super.supplement) + "]"; + + ", supplement=" + Arrays.toString(super.supplement) + "]"; } } @@ -1411,7 +1420,7 @@ public String toString() } /** - * Inner class representing a Format0 charset. + * Inner class representing a Format0 charset. */ private static class Format0Charset extends EmbeddedCharset { @@ -1430,7 +1439,7 @@ public String toString() } /** - * Inner class representing a Format1 charset. + * Inner class representing a Format1 charset. */ private static class Format1Charset extends EmbeddedCharset { @@ -1482,7 +1491,7 @@ public String toString() } /** - * Inner class representing a Format2 charset. + * Inner class representing a Format2 charset. */ private static class Format2Charset extends EmbeddedCharset { @@ -1529,7 +1538,7 @@ public String toString() } /** - * Inner class representing a rang mapping for a CID charset. + * Inner class representing a rang mapping for a CID charset. */ private static final class RangeMapping { diff --git a/library/src/main/java/com/tom_roush/fontbox/cff/CFFType1Font.java b/library/src/main/java/com/tom_roush/fontbox/cff/CFFType1Font.java index 672904ebf..d1dce336f 100644 --- a/library/src/main/java/com/tom_roush/fontbox/cff/CFFType1Font.java +++ b/library/src/main/java/com/tom_roush/fontbox/cff/CFFType1Font.java @@ -26,7 +26,6 @@ import com.tom_roush.fontbox.EncodedFont; import com.tom_roush.fontbox.type1.Type1CharStringReader; - /** * A Type 1-equivalent font program represented in a CFF file. Thread safe. * @@ -39,7 +38,7 @@ public class CFFType1Font extends CFFFont implements EncodedFont private CFFEncoding encoding; private final Map charStringCache = - new ConcurrentHashMap(); + new ConcurrentHashMap(); private final PrivateType1CharStringReader reader = new PrivateType1CharStringReader(); @@ -71,9 +70,7 @@ public float getWidth(String name) throws IOException @Override public boolean hasGlyph(String name) { - int sid = charset.getSID(name); - int gid = charset.getGIDForSID(sid); - return gid != 0; + return nameToGID(name) != 0; } @Override @@ -142,7 +139,7 @@ private Type2CharString getType2CharString(int gid, String name) throws IOExcept Type2CharStringParser parser = new Type2CharStringParser(fontName, name); List type2seq = parser.parse(bytes, globalSubrIndex, getLocalSubrIndex()); type2 = new Type2CharString(reader, fontName, name, gid, type2seq, getDefaultWidthX(), - getNominalWidthX()); + getNominalWidthX()); charStringCache.put(gid, type2); } return type2; diff --git a/library/src/main/java/com/tom_roush/fontbox/cff/Type1CharString.java b/library/src/main/java/com/tom_roush/fontbox/cff/Type1CharString.java index 566442e19..6acf09167 100644 --- a/library/src/main/java/com/tom_roush/fontbox/cff/Type1CharString.java +++ b/library/src/main/java/com/tom_roush/fontbox/cff/Type1CharString.java @@ -280,14 +280,14 @@ else if ("setcurrentpoint".equals(name)) { if (numbers.size() >= 2) { - setcurrentpoint(numbers.get(0), numbers.get(1)); + setCurrentPoint(numbers.get(0), numbers.get(1)); } } else if ("callothersubr".equals(name)) { if (!numbers.isEmpty()) { - callothersubr(numbers.get(0).intValue()); + callOtherSubr(numbers.get(0).intValue()); } } else if ("div".equals(name)) @@ -339,7 +339,7 @@ else if (name != null) * Sets the current absolute point without performing a moveto. * Used only with results from callothersubr */ - private void setcurrentpoint(Number x, Number y) + private void setCurrentPoint(Number x, Number y) { current.set(x.floatValue(), y.floatValue()); } @@ -348,7 +348,7 @@ private void setcurrentpoint(Number x, Number y) * Flex (via OtherSubrs) * @param num OtherSubrs entry number */ - private void callothersubr(int num) + private void callOtherSubr(int num) { if (num == 0) { @@ -491,9 +491,10 @@ private void seac(Number asb, Number adx, Number ady, Number bchar, Number achar try { Type1CharString accent = font.getType1CharString(accentName); - if (path == accent.getPath()) + Path accentPath = accent.getPath(); + if (path == accentPath) { - // PDFBOX-5339: avoid ArrayIndexOutOfBoundsException + // PDFBOX-5339: avoid ArrayIndexOutOfBoundsException // reproducable with poc file crash-4698e0dc7833a3f959d06707e01d03cda52a83f4 Log.w("PdfBox-Android", "Path for " + baseName + " and for accent " + accentName + " are same, ignored"); return; @@ -501,7 +502,7 @@ private void seac(Number asb, Number adx, Number ady, Number bchar, Number achar AffineTransform at = AffineTransform.getTranslateInstance( leftSideBearing.x + adx.floatValue() - asb.floatValue(), leftSideBearing.y + ady.floatValue()); - path.op(accent.getPath(), Path.Op.UNION); // TODO: PdfBox-Android + path.op(accentPath, Path.Op.UNION); // TODO: PdfBox-Android } catch (IOException e) { diff --git a/library/src/main/java/com/tom_roush/fontbox/cff/Type1CharStringParser.java b/library/src/main/java/com/tom_roush/fontbox/cff/Type1CharStringParser.java index 3db4f8161..c07644fa8 100644 --- a/library/src/main/java/com/tom_roush/fontbox/cff/Type1CharStringParser.java +++ b/library/src/main/java/com/tom_roush/fontbox/cff/Type1CharStringParser.java @@ -23,7 +23,6 @@ import java.util.ArrayList; import java.util.Deque; import java.util.List; - /** * This class represents a converter for a mapping into a Type 1 sequence. * @@ -34,6 +33,7 @@ */ public class Type1CharStringParser { + // 1-byte commands static final int RETURN = 11; static final int CALLSUBR = 10; @@ -84,10 +84,10 @@ private List parse(byte[] bytes, List subrs, List sequen if (!(obj instanceof Integer)) { Log.w("PdfBox-Android", "Parameter " + obj + " for CALLSUBR is ignored, integer expected in glyph '" - + glyphName + "' of font " + fontName); + + glyphName + "' of font " + fontName); continue; } - Integer operand = (Integer) obj; + int operand = (int) (Integer) obj; if (operand >= 0 && operand < subrs.size()) { @@ -95,7 +95,7 @@ private List parse(byte[] bytes, List subrs, List sequen parse(subrBytes, subrs, sequence); Object lastItem = sequence.get(sequence.size()-1); if (lastItem instanceof CharStringCommand && - ((CharStringCommand)lastItem).getKey().getValue()[0] == RETURN) + ((CharStringCommand)lastItem).getKey().getValue()[0] == RETURN) { sequence.remove(sequence.size()-1); // remove "return" command } @@ -103,10 +103,10 @@ private List parse(byte[] bytes, List subrs, List sequen else { Log.w("PdfBox-Android", "CALLSUBR is ignored, operand: " + operand - + ", subrs.size(): " + subrs.size() + " in glyph '" - + glyphName + "' of font " + fontName); + + ", subrs.size(): " + subrs.size() + " in glyph '" + + glyphName + "' of font " + fontName); // remove all parameters (there can be more than one) - while (sequence.get(sequence.size() - 1) instanceof Integer) + while (!sequence.isEmpty() && sequence.get(sequence.size() - 1) instanceof Integer) { sequence.remove(sequence.size() - 1); } diff --git a/library/src/main/java/com/tom_roush/fontbox/cff/Type1FontUtil.java b/library/src/main/java/com/tom_roush/fontbox/cff/Type1FontUtil.java index beb913d07..c2b5fc973 100644 --- a/library/src/main/java/com/tom_roush/fontbox/cff/Type1FontUtil.java +++ b/library/src/main/java/com/tom_roush/fontbox/cff/Type1FontUtil.java @@ -17,12 +17,13 @@ package com.tom_roush.fontbox.cff; import java.util.Locale; - /** * This class contains some helper methods handling Type1-Fonts. * * @author Villu Ruusmann + * @deprecated This class isn't used and will be removed in 4.0.0. */ +@Deprecated public final class Type1FontUtil { @@ -31,7 +32,7 @@ private Type1FontUtil() } /** - * Converts a byte-array into a string with the corresponding hex value. + * Converts a byte-array into a string with the corresponding hex value. * @param bytes the byte array * @return the string with the hex value */ @@ -43,7 +44,7 @@ public static String hexEncode(byte[] bytes) String string = Integer.toHexString(aByte & 0xff); if (string.length() == 1) { - sb.append("0"); + sb.append('0'); } sb.append(string.toUpperCase(Locale.US)); } diff --git a/library/src/main/java/com/tom_roush/fontbox/cff/Type2CharString.java b/library/src/main/java/com/tom_roush/fontbox/cff/Type2CharString.java index 2787cc003..496e81791 100644 --- a/library/src/main/java/com/tom_roush/fontbox/cff/Type2CharString.java +++ b/library/src/main/java/com/tom_roush/fontbox/cff/Type2CharString.java @@ -22,7 +22,6 @@ import java.util.List; import com.tom_roush.fontbox.type1.Type1CharStringReader; - /** * Represents a Type 2 CharString by converting it into an equivalent Type 1 CharString. * @@ -48,7 +47,7 @@ public class Type2CharString extends Type1CharString * @param nomWidthX nominal width */ public Type2CharString(Type1CharStringReader font, String fontName, String glyphName, int gid, List sequence, - int defaultWidthX, int nomWidthX) + int defaultWidthX, int nomWidthX) { super(font, fontName, glyphName); this.gid = gid; @@ -82,6 +81,43 @@ private void convertType1ToType2(List sequence) { type1Sequence = new ArrayList(); pathCount = 0; + + // PDFBOX-5987: the sequence contains several "num denom DIV" sequences whose results are used + // for further operations. However the converter only handles direct arguments properly, + // not arguments that are created at runtime on the stack. It's not possible to fix this + // by just copying the command codes because addAlternatingCurve / addCurve require + // switching the sequence of arguments. + // The solution below just replaces all "num denom DIV" sequences with its result. + // If more files with even more complex sequences appear we will have to get rid of the + // converter and implement a complete renderer like with type1 charstrings. + List newSequence = new ArrayList(sequence.size()); + for (int i = 0; i < sequence.size(); ++i) + { + Object obj = sequence.get(i); + if (obj instanceof CharStringCommand && + "div".equals(CharStringCommand.TYPE2_VOCABULARY.get(((CharStringCommand) obj).getKey())) && + i >= 2) + { + Object num = sequence.get(i - 2); + Object den = sequence.get(i - 1); + if (num instanceof Number && den instanceof Number) + { + float f = ((Number) num).floatValue() / ((Number) den).floatValue(); + newSequence.remove(newSequence.size() - 1); + newSequence.remove(newSequence.size() - 1); + newSequence.add(f); + } + else + { + newSequence.add(sequence.get(i)); // GIGO + } + } + else + { + newSequence.add(sequence.get(i)); + } + } + CharStringHandler handler = new CharStringHandler() { @Override public List handleCommand(List numbers, CharStringCommand command) @@ -89,7 +125,7 @@ public List handleCommand(List numbers, CharStringCommand comman return Type2CharString.this.handleCommand(numbers, command); } }; - handler.handleSequence(sequence); + handler.handleSequence(newSequence); } @SuppressWarnings(value = { "unchecked" }) @@ -170,10 +206,10 @@ else if ("hflex".equals(name)) if (numbers.size() >= 7) { List first = Arrays.asList(numbers.get(0), 0, - numbers.get(1), numbers.get(2), numbers.get(3), 0); + numbers.get(1), numbers.get(2), numbers.get(3), 0); List second = Arrays.asList(numbers.get(4), 0, - numbers.get(5), -(numbers.get(2).floatValue()), - numbers.get(6), 0); + numbers.get(5), -(numbers.get(2).floatValue()), + numbers.get(6), 0); addCommandList(Arrays.asList(first, second), new CharStringCommand(8)); } } @@ -188,9 +224,9 @@ else if ("hflex1".equals(name)) if (numbers.size() >= 9) { List first = Arrays.asList(numbers.get(0), numbers.get(1), - numbers.get(2), numbers.get(3), numbers.get(4), 0); + numbers.get(2), numbers.get(3), numbers.get(4), 0); List second = Arrays.asList(numbers.get(5), 0, - numbers.get(6), numbers.get(7), numbers.get(8), 0); + numbers.get(6), numbers.get(7), numbers.get(8), 0); addCommandList(Arrays.asList(first, second), new CharStringCommand(8)); } } @@ -204,9 +240,14 @@ else if ("flex1".equals(name)) dy += numbers.get(i * 2 + 1).intValue(); } List first = numbers.subList(0, 6); - List second = Arrays.asList(numbers.get(6), numbers.get(7), numbers.get(8), - numbers.get(9), (Math.abs(dx) > Math.abs(dy) ? numbers.get(10) : -dx), - (Math.abs(dx) > Math.abs(dy) ? -dy : numbers.get(10))); + boolean dxIsBigger = Math.abs(dx) > Math.abs(dy); + List second = Arrays.asList( + numbers.get(6), + numbers.get(7), + numbers.get(8), + numbers.get(9), + (dxIsBigger ? numbers.get(10) : -dx), + (dxIsBigger ? -dy : numbers.get(10))); addCommandList(Arrays.asList(first, second), new CharStringCommand(8)); } else if ("hstemhm".equals(name)) @@ -232,9 +273,9 @@ else if ("rcurveline".equals(name)) if (numbers.size() >= 2) { addCommandList(split(numbers.subList(0, numbers.size() - 2), 6), - new CharStringCommand(8)); + new CharStringCommand(8)); addCommand(numbers.subList(numbers.size() - 2, numbers.size()), - new CharStringCommand(5)); + new CharStringCommand(5)); } } else if ("rlinecurve".equals(name)) @@ -242,9 +283,9 @@ else if ("rlinecurve".equals(name)) if (numbers.size() >= 6) { addCommandList(split(numbers.subList(0, numbers.size() - 6), 2), - new CharStringCommand(5)); + new CharStringCommand(5)); addCommand(numbers.subList(numbers.size() - 6, numbers.size()), - new CharStringCommand(8)); + new CharStringCommand(8)); } } else if ("vvcurveto".equals(name)) @@ -269,13 +310,13 @@ private List clearStack(List numbers, boolean flag) if (flag) { addCommand(Arrays.asList((Number) 0f, numbers.get(0).floatValue() + nominalWidthX), - new CharStringCommand(13)); + new CharStringCommand(13)); numbers = numbers.subList(1, numbers.size()); } else { addCommand(Arrays.asList((Number) 0f, defWidthX), - new CharStringCommand(13)); + new CharStringCommand(13)); } } return numbers; @@ -302,8 +343,8 @@ private void markPath() private void closeCharString2Path() { CharStringCommand command = pathCount > 0 ? (CharStringCommand) type1Sequence - .get(type1Sequence.size() - 1) - : null; + .get(type1Sequence.size() - 1) + : null; CharStringCommand closepathCommand = new CharStringCommand(9); if (command != null && !closepathCommand.equals(command)) @@ -317,7 +358,7 @@ private void drawAlternatingLine(List numbers, boolean horizontal) while (!numbers.isEmpty()) { addCommand(numbers.subList(0, 1), new CharStringCommand( - horizontal ? 6 : 7)); + horizontal ? 6 : 7)); numbers = numbers.subList(1, numbers.size()); horizontal = !horizontal; } @@ -332,15 +373,15 @@ private void drawAlternatingCurve(List numbers, boolean horizontal) { addCommand(Arrays.asList(numbers.get(0), 0, numbers.get(1), numbers.get(2), last ? numbers.get(4) - : 0, numbers.get(3)), - new CharStringCommand(8)); + : 0, numbers.get(3)), + new CharStringCommand(8)); } else { addCommand(Arrays.asList(0, numbers.get(0), numbers.get(1), numbers.get(2), numbers.get(3), last ? numbers.get(4) : 0), - new CharStringCommand(8)); + new CharStringCommand(8)); } numbers = numbers.subList(last ? 5 : 4, numbers.size()); horizontal = !horizontal; @@ -356,17 +397,17 @@ private void drawCurve(List numbers, boolean horizontal) if (horizontal) { addCommand(Arrays.asList(numbers.get(first ? 1 : 0), - first ? numbers.get(0) : 0, numbers - .get(first ? 2 : 1), - numbers.get(first ? 3 : 2), numbers.get(first ? 4 : 3), - 0), new CharStringCommand(8)); + first ? numbers.get(0) : 0, numbers + .get(first ? 2 : 1), + numbers.get(first ? 3 : 2), numbers.get(first ? 4 : 3), + 0), new CharStringCommand(8)); } else { addCommand(Arrays.asList(first ? numbers.get(0) : 0, numbers.get(first ? 1 : 0), numbers - .get(first ? 2 : 1), numbers.get(first ? 3 : 2), + .get(first ? 2 : 1), numbers.get(first ? 3 : 2), 0, numbers.get(first ? 4 : 3)), - new CharStringCommand(8)); + new CharStringCommand(8)); } numbers = numbers.subList(first ? 5 : 4, numbers.size()); } diff --git a/library/src/main/java/com/tom_roush/fontbox/cmap/CMap.java b/library/src/main/java/com/tom_roush/fontbox/cmap/CMap.java index fcc652c51..6fd815759 100644 --- a/library/src/main/java/com/tom_roush/fontbox/cmap/CMap.java +++ b/library/src/main/java/com/tom_roush/fontbox/cmap/CMap.java @@ -24,7 +24,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; - /** * This class represents a CMap file. * @@ -32,6 +31,7 @@ */ public class CMap { + private int wmode = 0; private String cmapName = null; private String cmapVersion = null; @@ -140,7 +140,7 @@ public int readCode(InputStream in) throws IOException else { Log.w("PdfBox-Android", "mark() and reset() not supported, " + (maxCodeLength - 1) + - " bytes have been skipped"); + " bytes have been skipped"); } return toInt(bytes, minCodeLength); // Adobe Reader behavior } @@ -183,24 +183,6 @@ public int toCID(int code) return 0; } - /** - * Convert the given part of a byte array to an integer. - * @param data the byte array - * @param offset The offset into the byte array. - * @param length The length of the data we are getting. - * @return the resulting integer - */ - private int getCodeFromArray( byte[] data, int offset, int length ) - { - int code = 0; - for( int i=0; i tok } private void addMappingFrombfrange(CMap cmap, byte[] startCode, int values, - byte[] tokenBytes) + byte[] tokenBytes) { for (int i = 0; i < values; i++) { @@ -527,217 +526,218 @@ private Object parseNextToken(PushbackInputStream is) throws IOException } switch (nextByte) { - case '%': + case '%': + { + // header operations, for now return the entire line + // may need to smarter in the future + StringBuilder buffer = new StringBuilder(); + buffer.append((char) nextByte); + readUntilEndOfLine(is, buffer); + retval = buffer.toString(); + break; + } + case '(': + { + StringBuilder buffer = new StringBuilder(); + int stringByte = is.read(); + + while (stringByte != -1 && stringByte != ')') { - // header operations, for now return the entire line - // may need to smarter in the future - StringBuilder buffer = new StringBuilder(); - buffer.append((char) nextByte); - readUntilEndOfLine(is, buffer); - retval = buffer.toString(); - break; + buffer.append((char) stringByte); + stringByte = is.read(); } - case '(': + retval = buffer.toString(); + break; + } + case '>': + { + int secondCloseBrace = is.read(); + if (secondCloseBrace == '>') { - StringBuilder buffer = new StringBuilder(); - int stringByte = is.read(); - - while (stringByte != -1 && stringByte != ')') - { - buffer.append((char) stringByte); - stringByte = is.read(); - } - retval = buffer.toString(); - break; + retval = MARK_END_OF_DICTIONARY; } - case '>': + else { - int secondCloseBrace = is.read(); - if (secondCloseBrace == '>') - { - retval = MARK_END_OF_DICTIONARY; - } - else - { - throw new IOException("Error: expected the end of a dictionary."); - } - break; + throw new IOException("Error: expected the end of a dictionary."); } - case ']': + break; + } + case ']': + { + retval = MARK_END_OF_ARRAY; + break; + } + case '[': + { + List list = new ArrayList(); + + Object nextToken = parseNextToken(is); + while (nextToken != null && !MARK_END_OF_ARRAY.equals(nextToken)) { - retval = MARK_END_OF_ARRAY; - break; + list.add(nextToken); + nextToken = parseNextToken(is); } - case '[': - { - List list = new ArrayList(); - - Object nextToken = parseNextToken(is); - while (nextToken != null && !MARK_END_OF_ARRAY.equals(nextToken)) + retval = list; + break; + } + case '<': + { + int theNextByte = is.read(); + if (theNextByte == '<') + { + Map result = new HashMap(); + // we are reading a dictionary + Object key = parseNextToken(is); + while (key instanceof LiteralName && + !MARK_END_OF_DICTIONARY.equals(((LiteralName) key).name)) { - list.add(nextToken); - nextToken = parseNextToken(is); + Object value = parseNextToken(is); + result.put(((LiteralName) key).name, value); + key = parseNextToken(is); } - retval = list; - break; + retval = result; } - case '<': + else { - int theNextByte = is.read(); - if (theNextByte == '<') + // won't read more than 512 bytes + + int multiplyer = 16; + int bufferIndex = -1; + while (theNextByte != -1 && theNextByte != '>') { - Map result = new HashMap(); - // we are reading a dictionary - Object key = parseNextToken(is); - while (key instanceof LiteralName && !MARK_END_OF_DICTIONARY.equals(key)) + int intValue = 0; + if (theNextByte >= '0' && theNextByte <= '9') { - Object value = parseNextToken(is); - result.put(((LiteralName) key).name, value); - key = parseNextToken(is); + intValue = theNextByte - '0'; } - retval = result; - } - else - { - // won't read more than 512 bytes - - int multiplyer = 16; - int bufferIndex = -1; - while (theNextByte != -1 && theNextByte != '>') + else if (theNextByte >= 'A' && theNextByte <= 'F') { - int intValue = 0; - if (theNextByte >= '0' && theNextByte <= '9') - { - intValue = theNextByte - '0'; - } - else if (theNextByte >= 'A' && theNextByte <= 'F') - { - intValue = 10 + theNextByte - 'A'; - } - else if (theNextByte >= 'a' && theNextByte <= 'f') - { - intValue = 10 + theNextByte - 'a'; - } - // all kind of whitespaces may occur in malformed CMap files - // see PDFBOX-2035 - else if (isWhitespaceOrEOF(theNextByte)) - { - // skipping whitespaces - theNextByte = is.read(); - continue; - } - else - { - throw new IOException("Error: expected hex character and not " + (char) theNextByte + ":" + intValue = 10 + theNextByte - 'A'; + } + else if (theNextByte >= 'a' && theNextByte <= 'f') + { + intValue = 10 + theNextByte - 'a'; + } + // all kind of whitespaces may occur in malformed CMap files + // see PDFBOX-2035 + else if (isWhitespaceOrEOF(theNextByte)) + { + // skipping whitespaces + theNextByte = is.read(); + continue; + } + else + { + throw new IOException("Error: expected hex character and not " + (char) theNextByte + ":" + theNextByte); - } - intValue *= multiplyer; - if (multiplyer == 16) + } + intValue *= multiplyer; + if (multiplyer == 16) + { + bufferIndex++; + if (bufferIndex >= tokenParserByteBuffer.length) { - bufferIndex++; - if (bufferIndex >= tokenParserByteBuffer.length) - { - throw new IOException("cmap token ist larger than buffer size " + + throw new IOException("cmap token ist larger than buffer size " + tokenParserByteBuffer.length); - } - tokenParserByteBuffer[bufferIndex] = 0; - multiplyer = 1; } - else - { - multiplyer = 16; - } - tokenParserByteBuffer[bufferIndex] += intValue; - theNextByte = is.read(); + tokenParserByteBuffer[bufferIndex] = 0; + multiplyer = 1; + } + else + { + multiplyer = 16; } - byte[] finalResult = new byte[bufferIndex + 1]; - System.arraycopy(tokenParserByteBuffer, 0, finalResult, 0, bufferIndex + 1); - retval = finalResult; + tokenParserByteBuffer[bufferIndex] += intValue; + theNextByte = is.read(); } - break; + byte[] finalResult = new byte[bufferIndex + 1]; + System.arraycopy(tokenParserByteBuffer, 0, finalResult, 0, bufferIndex + 1); + retval = finalResult; } - case '/': - { - StringBuilder buffer = new StringBuilder(); - int stringByte = is.read(); + break; + } + case '/': + { + StringBuilder buffer = new StringBuilder(); + int stringByte = is.read(); - while (!isWhitespaceOrEOF(stringByte) && !isDelimiter(stringByte)) - { - buffer.append((char) stringByte); - stringByte = is.read(); - } - if (isDelimiter( stringByte)) - { - is.unread(stringByte); - } - retval = new LiteralName(buffer.toString()); - break; + while (!isWhitespaceOrEOF(stringByte) && !isDelimiter(stringByte)) + { + buffer.append((char) stringByte); + stringByte = is.read(); } - case -1: + if (isDelimiter( stringByte)) { - // EOF returning null - break; + is.unread(stringByte); } - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - { - StringBuilder buffer = new StringBuilder(); + retval = new LiteralName(buffer.toString()); + break; + } + case -1: + { + // EOF returning null + break; + } + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + StringBuilder buffer = new StringBuilder(); + buffer.append((char) nextByte); + nextByte = is.read(); + + while (!isWhitespaceOrEOF(nextByte) && (Character.isDigit((char) nextByte) || nextByte == '.')) + { buffer.append((char) nextByte); nextByte = is.read(); - - while (!isWhitespaceOrEOF(nextByte) && (Character.isDigit((char) nextByte) || nextByte == '.')) - { - buffer.append((char) nextByte); - nextByte = is.read(); - } - is.unread(nextByte); - String value = buffer.toString(); - try + } + is.unread(nextByte); + String value = buffer.toString(); + try + { + if (value.indexOf('.') >= 0) { - if (value.indexOf('.') >= 0) - { - retval = Double.valueOf(value); - } - else - { - retval = Integer.valueOf(value); - } + retval = Double.valueOf(value); } - catch (NumberFormatException ex) + else { - throw new IOException("Invalid number '" + value + "'", ex); + retval = Integer.valueOf(value); } - break; } - default: + catch (NumberFormatException ex) + { + throw new IOException("Invalid number '" + value + "'", ex); + } + break; + } + default: + { + StringBuilder buffer = new StringBuilder(); + buffer.append((char) nextByte); + nextByte = is.read(); + + // newline separator may be missing in malformed CMap files + // see PDFBOX-2035 + while (!isWhitespaceOrEOF(nextByte) && !isDelimiter(nextByte) && !Character.isDigit(nextByte)) { - StringBuilder buffer = new StringBuilder(); buffer.append((char) nextByte); nextByte = is.read(); - - // newline separator may be missing in malformed CMap files - // see PDFBOX-2035 - while (!isWhitespaceOrEOF(nextByte) && !isDelimiter(nextByte) && !Character.isDigit(nextByte)) - { - buffer.append((char) nextByte); - nextByte = is.read(); - } - if (isDelimiter(nextByte) || Character.isDigit(nextByte)) - { - is.unread(nextByte); - } - retval = new Operator(buffer.toString()); - - break; } + if (isDelimiter(nextByte) || Character.isDigit(nextByte)) + { + is.unread(nextByte); + } + retval = new Operator(buffer.toString()); + + break; + } } return retval; } @@ -780,6 +780,10 @@ private boolean isDelimiter(int aByte) private boolean increment(byte[] data, int position, boolean useStrictMode) { + if (position < 0) + { + return false; + } if (position > 0 && (data[position] & 0xFF) == 255) { // PDFBOX-4661: avoid overflow of the last byte, all following values are undefined @@ -811,7 +815,11 @@ private int createIntFromBytes(byte[] bytes) private String createStringFromBytes(byte[] bytes) { - return new String(bytes, bytes.length == 1 ? Charsets.ISO_8859_1 : Charsets.UTF_16BE); + if (bytes.length <= 2) + { + return CMapStrings.getMapping(bytes); + } + return new String(bytes, Charsets.UTF_16BE); } /** diff --git a/library/src/main/java/com/tom_roush/fontbox/cmap/CMapStrings.java b/library/src/main/java/com/tom_roush/fontbox/cmap/CMapStrings.java new file mode 100644 index 000000000..28003b5e5 --- /dev/null +++ b/library/src/main/java/com/tom_roush/fontbox/cmap/CMapStrings.java @@ -0,0 +1,117 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.tom_roush.fontbox.cmap; + +import java.util.ArrayList; +import java.util.List; + +import com.tom_roush.fontbox.util.Charsets; +/** + * Many CMaps are using the same values for the mapped strings. This class provides all common one- and two-byte + * mappings to avoid duplicate strings. + */ +public class CMapStrings +{ + private static final List twoByteMappings = new ArrayList(256 * 256); + private static final List oneByteMappings = new ArrayList(256); + + private static final List indexValues = new ArrayList(256 * 256); + private static final List oneByteValues = new ArrayList(256); + private static final List twoByteValues = new ArrayList(256 * 256); + + static + { + // create all mappings when loading the class to avoid concurrency issues + fillMappings(); + } + + private CMapStrings() + { + } + + private static void fillMappings() + { + for (int i = 0; i < 256; i++) + { + for (int j = 0; j < 256; j++) + { + byte[] bytes = { (byte) i, (byte) j }; + twoByteMappings.add(new String(bytes, Charsets.UTF_16BE)); + twoByteValues.add(bytes); + indexValues.add((i * 256) + j); + } + } + for (int i = 0; i < 256; i++) + { + byte[] bytes = { (byte) i }; + oneByteMappings.add(new String(bytes, Charsets.ISO_8859_1)); + oneByteValues.add(bytes); + } + } + + /** + * Get the mapped string value for the given combination of bytes. The mapping is limited to one and two-byte + * mappings. Any longer byte sequence produces null as return value. + * + * @param bytes the given combination of bytes + * @return the string representation for the given combination of bytes + */ + public static String getMapping(byte[] bytes) + { + if (bytes.length > 2) + { + return null; + } + return bytes.length == 1 ? oneByteMappings.get(CMap.toInt(bytes, 1)) + : twoByteMappings.get(CMap.toInt(bytes, bytes.length)); + } + + /** + * Get an Integer instance of the given combination of bytes. Each value is a singleton to avoid multiple instances + * for same value. The values are limited to one and two-byte sequences. Any longer byte sequence produces null as + * return value. + * + * @param bytes the given combination of bytes + * @return the Integer representation for the given combination of bytes + */ + public static Integer getIndexValue(byte[] bytes) + { + if (bytes.length > 2) + { + return null; + } + return indexValues.get(CMap.toInt(bytes, bytes.length)); + } + + /** + * Get a singleton instance of the given combination of bytes to avoid multiple instances for same value. The values + * are limited to one and two-byte sequences. Any longer byte sequence produces null as return value. + * + * @param bytes the given combination of bytes + * @return a singleton instance for the given combination of bytes + */ + public static byte[] getByteValue(byte[] bytes) + { + if (bytes.length > 2) + { + return null; + } + return bytes.length == 1 ? oneByteValues.get(CMap.toInt(bytes, 1)) + : twoByteValues.get(CMap.toInt(bytes, 2)); + } +} diff --git a/library/src/main/java/com/tom_roush/fontbox/pfb/PfbParser.java b/library/src/main/java/com/tom_roush/fontbox/pfb/PfbParser.java index b36016901..aeed65613 100644 --- a/library/src/main/java/com/tom_roush/fontbox/pfb/PfbParser.java +++ b/library/src/main/java/com/tom_roush/fontbox/pfb/PfbParser.java @@ -16,6 +16,8 @@ */ package com.tom_roush.fontbox.pfb; +import android.util.Log; + import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -23,8 +25,11 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; +import com.tom_roush.pdfbox.android.PDFBoxConfig; /** * Parser for a pfb-file. * @@ -33,6 +38,7 @@ */ public class PfbParser { + /** * the pfb header length. * (start-marker (1 byte), ascii-/binary-marker (1 byte), size (4 byte)) @@ -56,10 +62,9 @@ public class PfbParser private static final int BINARY_MARKER = 0x02; /** - * The record types in the pfb-file. + * the EOF marker. */ - private static final int[] PFB_RECORDS = {ASCII_MARKER, BINARY_MARKER, - ASCII_MARKER}; + private static final int EOF_MARKER = 0x03; /** * buffersize. @@ -72,12 +77,12 @@ public class PfbParser private byte[] pfbdata; /** - * the lengths of the records. + * the lengths of the records (ASCII, BINARY, ASCII) */ - private int[] lengths; + private final int[] lengths = new int[3]; // sample (pfb-file) - // 00000000 80 01 8b 15 00 00 25 21 50 53 2d 41 64 6f 62 65 + // 00000000 80 01 8b 15 00 00 25 21 50 53 2d 41 64 6f 62 65 // ......%!PS-Adobe @@ -136,47 +141,110 @@ private void parsePfb(final byte[] pfb) throws IOException { throw new IOException("PFB header missing"); } + // read into segments and keep them + List typeList = new ArrayList(3); + List barrList = new ArrayList(3); ByteArrayInputStream in = new ByteArrayInputStream(pfb); - pfbdata = new byte[pfb.length - PFB_HEADER_LENGTH]; - lengths = new int[PFB_RECORDS.length]; - int pointer = 0; - for (int records = 0; records < PFB_RECORDS.length; records++) + long total = 0; + do { - if (in.read() != START_MARKER) + int r = in.read(); + if (r == -1 && total > 0) + { + break; // EOF + } + if (r != START_MARKER) { throw new IOException("Start marker missing"); } - - if (in.read() != PFB_RECORDS[records]) + int recordType = in.read(); + if (recordType == EOF_MARKER) + { + break; + } + if (recordType != ASCII_MARKER && recordType != BINARY_MARKER) { - throw new IOException("Incorrect record type"); + throw new IOException("Incorrect record type: " + recordType); } int size = in.read(); size += in.read() << 8; size += in.read() << 16; size += in.read() << 24; + if (PDFBoxConfig.isDebugEnabled()) + { + Log.d("PdfBox-Android", "record type: " + recordType + ", segment size: " + size); + } if (size < 0) { - throw new IOException("PFB record size is negative: " + size); + throw new IOException("record size " + size + " is negative"); + } + if (size > pfb.length) + { + // PDFBOX-6044: avoid potential OOM + throw new IOException("record size " + size + " would be larger than the input"); + } + byte[] ar = new byte[size]; + int got = in.read(ar); + if (got != size) + { + throw new EOFException("EOF while reading PFB font"); } - lengths[records] = size; - if (pointer >= pfbdata.length) + total += size; + typeList.add(recordType); + barrList.add(ar); + } + while (true); + + // We now have ASCII and binary segments. Lets arrange these so that the ASCII segments + // come first, then the binary segments, then the last ASCII segment if it is + // 0000... cleartomark + + if (total > pfb.length) + { + // PDFBOX-6044: avoid potential OOM + throw new IOException("total record size " + total + " would be larger than the input"); + } + pfbdata = new byte[(int) total]; + byte[] cleartomarkSegment = null; + int dstPos = 0; + + // copy the ASCII segments + for (int i = 0; i < typeList.size(); ++i) + { + if (typeList.get(i) != ASCII_MARKER) { - throw new EOFException("attempted to read past EOF"); + continue; } - if (size > pfbdata.length - pointer) + byte[] ar = barrList.get(i); + if (i == typeList.size() - 1 && ar.length < 600 && + new String(ar, "US-ASCII").contains("cleartomark")) { - throw new EOFException("attempted to read " + size + " bytes at position " + pointer + - " into array of size " + pfbdata.length + ", but only space for " + - (pfbdata.length - pointer) + " bytes left"); + cleartomarkSegment = ar; + continue; } - int got = in.read(pfbdata, pointer, size); - if (got < 0) + System.arraycopy(ar, 0, pfbdata, dstPos, ar.length); + dstPos += ar.length; + } + lengths[0] = dstPos; + + // copy the binary segments + for (int i = 0; i < typeList.size(); ++i) + { + if (typeList.get(i) != BINARY_MARKER) { - throw new EOFException(); + continue; } - pointer += got; + byte[] ar = barrList.get(i); + System.arraycopy(ar, 0, pfbdata, dstPos, ar.length); + dstPos += ar.length; + } + lengths[1] = dstPos - lengths[0]; + + if (cleartomarkSegment != null) + { + System.arraycopy(cleartomarkSegment, 0, pfbdata, dstPos, cleartomarkSegment.length); + lengths[2] = cleartomarkSegment.length; } } diff --git a/library/src/main/java/com/tom_roush/fontbox/ttf/CmapSubtable.java b/library/src/main/java/com/tom_roush/fontbox/ttf/CmapSubtable.java index 82bb2ebca..a536b3cb1 100644 --- a/library/src/main/java/com/tom_roush/fontbox/ttf/CmapSubtable.java +++ b/library/src/main/java/com/tom_roush/fontbox/ttf/CmapSubtable.java @@ -23,10 +23,11 @@ import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Map.Entry; - +import java.util.Map; +import java.util.Set; /** * A "cmap" subtable. * @@ -34,6 +35,7 @@ */ public class CmapSubtable implements CmapLookup { + private static final long LEAD_OFFSET = 0xD800l - (0x10000 >> 10); private static final long SURROGATE_OFFSET = 0x10000l - (0xD800 << 10) - 0xDC00; @@ -42,7 +44,7 @@ public class CmapSubtable implements CmapLookup private long subTableOffset; private int[] glyphIdToCharacterCode; private final Map> glyphIdToCharacterCodeMultiple = new HashMap>(); - private Map characterCodeToGlyphId= new HashMap(); + private Map characterCodeToGlyphId = Collections.emptyMap(); /** * This will read the required data from the stream. @@ -86,35 +88,35 @@ void initSubtable(CmapTable cmap, int numGlyphs, TTFDataStream data) throws IOEx switch (subtableFormat) { - case 0: - processSubtype0(data); - break; - case 2: - processSubtype2(data, numGlyphs); - break; - case 4: - processSubtype4(data, numGlyphs); - break; - case 6: - processSubtype6(data, numGlyphs); - break; - case 8: - processSubtype8(data, numGlyphs); - break; - case 10: - processSubtype10(data, numGlyphs); - break; - case 12: - processSubtype12(data, numGlyphs); - break; - case 13: - processSubtype13(data, numGlyphs); - break; - case 14: - processSubtype14(data, numGlyphs); - break; - default: - throw new IOException("Unknown cmap format:" + subtableFormat); + case 0: + processSubtype0(data); + break; + case 2: + processSubtype2(data, numGlyphs); + break; + case 4: + processSubtype4(data, numGlyphs); + break; + case 6: + processSubtype6(data, numGlyphs); + break; + case 8: + processSubtype8(data, numGlyphs); + break; + case 10: + processSubtype10(data, numGlyphs); + break; + case 12: + processSubtype12(data, numGlyphs); + break; + case 13: + processSubtype13(data, numGlyphs); + break; + case 14: + processSubtype14(data, numGlyphs); + break; + default: + throw new IOException("Unknown cmap format:" + subtableFormat); } } @@ -218,10 +220,10 @@ void processSubtype10(TTFDataStream data, int numGlyphs) throws IOException } if (startCode < 0 || startCode > 0x0010FFFF || (startCode + numChars) > 0x0010FFFF - || ((startCode + numChars) >= 0x0000D800 && (startCode + numChars) <= 0x0000DFFF)) + || ((startCode + numChars) >= 0x0000D800 && (startCode + numChars) <= 0x0000DFFF)) { throw new IOException("Invalid character codes, " + - String.format("startCode: 0x%X, numChars: %d", startCode, numChars)); + String.format("startCode: 0x%X, numChars: %d", startCode, numChars)); } } @@ -319,7 +321,7 @@ void processSubtype13(TTFDataStream data, int numGlyphs) throws IOException } if ((endCode > 0 && endCode < firstCode) || endCode > 0x0010FFFF - || (endCode >= 0x0000D800 && endCode <= 0x0000DFFF)) + || (endCode >= 0x0000D800 && endCode <= 0x0000DFFF)) { throw new IOException("Invalid character code " + String.format("0x%X", endCode)); } @@ -411,11 +413,11 @@ void processSubtype4(TTFDataStream data, int numGlyphs) throws IOException { int start = startCount[i]; int end = endCount[i]; - int delta = idDelta[i]; - int rangeOffset = idRangeOffset[i]; - long segmentRangeOffset = idRangeOffsetPosition + (i * 2L) + rangeOffset; if (start != 65535 && end != 65535) { + int delta = idDelta[i]; + int rangeOffset = idRangeOffset[i]; + long segmentRangeOffset = idRangeOffsetPosition + (i * 2L) + rangeOffset; for (int j = start; j <= end; j++) { if (rangeOffset == 0) @@ -468,7 +470,7 @@ private void buildGlyphIdToCharacterCodeLookup(int maxGlyphId) List mappedValues = glyphIdToCharacterCodeMultiple.get(entry.getValue()); if (mappedValues == null) { - mappedValues = new ArrayList(); + mappedValues = new ArrayList(2); glyphIdToCharacterCodeMultiple.put(entry.getValue(), mappedValues); mappedValues.add(glyphIdToCharacterCode[entry.getValue()]); // mark value as multiple mapping @@ -515,6 +517,8 @@ void processSubtype2(TTFDataStream data, int numGlyphs) throws IOException Log.w("PdfBox-Android", "subtable has no glyphs"); return; } + Set logged = new HashSet(); + boolean maxLoggingReached = false; for (int i = 0; i <= maxSubHeaderIndex; ++i) { SubHeader sh = subHeaders[i]; @@ -546,7 +550,16 @@ void processSubtype2(TTFDataStream data, int numGlyphs) throws IOException if (p >= numGlyphs) { - Log.w("PdfBox-Android", "glyphId " + p + " for charcode " + charCode + " ignored, numGlyphs is " + numGlyphs); + if (!maxLoggingReached && !logged.contains(p)) + { + Log.w("PdfBox-Android", "glyphId " + p + " for charcode " + charCode + " ignored, numGlyphs is " + numGlyphs); + logged.add(p); + if (logged.size() > 10) + { + Log.w("PdfBox-Android", "too many bad glyphIds, more won't be reported for this table"); + maxLoggingReached = true; + } + } continue; } diff --git a/library/src/main/java/com/tom_roush/fontbox/ttf/GlyfCompositeComp.java b/library/src/main/java/com/tom_roush/fontbox/ttf/GlyfCompositeComp.java index 5d5c0892b..6cd053ffe 100644 --- a/library/src/main/java/com/tom_roush/fontbox/ttf/GlyfCompositeComp.java +++ b/library/src/main/java/com/tom_roush/fontbox/ttf/GlyfCompositeComp.java @@ -1,28 +1,25 @@ /* - - Licensed to the Apache Software Foundation (ASF) under one or more - contributor license agreements. See the NOTICE file distributed with - this work for additional information regarding copyright ownership. - The ASF licenses this file to You under the Apache License, Version 2.0 - (the "License"); you may not use this file except in compliance with - the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package com.tom_roush.fontbox.ttf; import java.io.IOException; - /** - * This class is based on code from Apache Batik a subproject of Apache XMLGraphics. see - * http://xmlgraphics.apache.org/batik/ for further details. + * This class is based on code from Apache Batik, a subproject of Apache XMLGraphics. See + * The Apache™ Batik Project for further details. */ public class GlyfCompositeComp { diff --git a/library/src/main/java/com/tom_roush/fontbox/ttf/GlyfCompositeDescript.java b/library/src/main/java/com/tom_roush/fontbox/ttf/GlyfCompositeDescript.java index 0ab61548e..16ecb9d77 100644 --- a/library/src/main/java/com/tom_roush/fontbox/ttf/GlyfCompositeDescript.java +++ b/library/src/main/java/com/tom_roush/fontbox/ttf/GlyfCompositeDescript.java @@ -1,20 +1,18 @@ /* - - Licensed to the Apache Software Foundation (ASF) under one or more - contributor license agreements. See the NOTICE file distributed with - this work for additional information regarding copyright ownership. - The ASF licenses this file to You under the Apache License, Version 2.0 - (the "License"); you may not use this file except in compliance with - the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package com.tom_roush.fontbox.ttf; @@ -22,17 +20,17 @@ Licensed to the Apache Software Foundation (ASF) under one or more import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; - /** * Glyph description for composite glyphs. Composite glyphs are made up of one * or more simple glyphs, usually with some sort of transformation applied to * each. * * This class is based on code from Apache Batik a subproject of Apache - * XMLGraphics. see http://xmlgraphics.apache.org/batik/ for further details. + * XMLGraphics. See The Apache™ Batik Project for further details. */ public class GlyfCompositeDescript extends GlyfDescript { @@ -49,9 +47,10 @@ public class GlyfCompositeDescript extends GlyfDescript * * @param bais the stream to be read * @param glyphTable the Glyphtable containing all glyphs + * @param level current level * @throws IOException is thrown if something went wrong */ - GlyfCompositeDescript(TTFDataStream bais, GlyphTable glyphTable) throws IOException + GlyfCompositeDescript(TTFDataStream bais, GlyphTable glyphTable, int level) throws IOException { super((short) -1, bais); @@ -71,7 +70,7 @@ public class GlyfCompositeDescript extends GlyfDescript { readInstructions(bais, (bais.readUnsignedShort())); } - initDescriptions(); + initDescriptions(level); } /** @@ -250,6 +249,16 @@ public int getComponentCount() return components.size(); } + /** + * Gets a view to the composite components. + * + * @return unmodifiable list of this composite glyph's {@linkplain GlyfCompositeComp components} + */ + public List getComponents() + { + return Collections.unmodifiableList(components); + } + private GlyfCompositeComp getCompositeComp(int i) { for (GlyfCompositeComp c : components) @@ -276,14 +285,14 @@ private GlyfCompositeComp getCompositeCompEndPt(int i) return null; } - private void initDescriptions() + private void initDescriptions(int level) { for (GlyfCompositeComp component : components) { try { int index = component.getGlyphIndex(); - GlyphData glyph = glyphTable.getGlyph(index); + GlyphData glyph = glyphTable.getGlyph(index, level); if (glyph != null) { descriptions.put(index, glyph.getDescription()); diff --git a/library/src/main/java/com/tom_roush/fontbox/ttf/GlyfDescript.java b/library/src/main/java/com/tom_roush/fontbox/ttf/GlyfDescript.java index 1cb9439e5..716db312d 100644 --- a/library/src/main/java/com/tom_roush/fontbox/ttf/GlyfDescript.java +++ b/library/src/main/java/com/tom_roush/fontbox/ttf/GlyfDescript.java @@ -1,28 +1,25 @@ /* - - Licensed to the Apache Software Foundation (ASF) under one or more - contributor license agreements. See the NOTICE file distributed with - this work for additional information regarding copyright ownership. - The ASF licenses this file to You under the Apache License, Version 2.0 - (the "License"); you may not use this file except in compliance with - the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package com.tom_roush.fontbox.ttf; import java.io.IOException; - /** - * This class is based on code from Apache Batik a subproject of Apache XMLGraphics. - * see http://xmlgraphics.apache.org/batik/ for further details. + * This class is based on code from Apache Batik, a subproject of Apache XMLGraphics. + * see The Apache™ Batik Project for further details. * */ public abstract class GlyfDescript implements GlyphDescription @@ -42,7 +39,7 @@ public abstract class GlyfDescript implements GlyphDescription */ public static final byte Y_SHORT_VECTOR = 0x04; /** - * if set, the next byte specifies the number of additional + * if set, the next byte specifies the number of additional * times this set of flags is to be repeated. */ public static final byte REPEAT = 0x08; @@ -109,7 +106,7 @@ public int[] getInstructions() /** * Read the hinting instructions. * @param bais the stream to be read - * @param count the number of instructions to be read + * @param count the number of instructions to be read * @throws IOException is thrown if something went wrong */ void readInstructions(TTFDataStream bais, int count) throws IOException diff --git a/library/src/main/java/com/tom_roush/fontbox/ttf/GlyfSimpleDescript.java b/library/src/main/java/com/tom_roush/fontbox/ttf/GlyfSimpleDescript.java index 95d08615e..39a237fc0 100644 --- a/library/src/main/java/com/tom_roush/fontbox/ttf/GlyfSimpleDescript.java +++ b/library/src/main/java/com/tom_roush/fontbox/ttf/GlyfSimpleDescript.java @@ -1,34 +1,30 @@ /* - - Licensed to the Apache Software Foundation (ASF) under one or more - contributor license agreements. See the NOTICE file distributed with - this work for additional information regarding copyright ownership. - The ASF licenses this file to You under the Apache License, Version 2.0 - (the "License"); you may not use this file except in compliance with - the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package com.tom_roush.fontbox.ttf; import android.util.Log; import java.io.IOException; - /** - * This class is based on code from Apache Batik a subproject of Apache XMLGraphics. see - * http://xmlgraphics.apache.org/batik/ for further details. + * This class is based on code from Apache Batik, a subproject of Apache XMLGraphics. see + * The Apache™ Batik Project for further details. */ public class GlyfSimpleDescript extends GlyfDescript { - private int[] endPtsOfContours; private byte[] flags; private short[] xCoordinates; @@ -59,7 +55,7 @@ public class GlyfSimpleDescript extends GlyfDescript super(numberOfContours, bais); /* - * https://developer.apple.com/fonts/TTRefMan/RM06/Chap6glyf.html + * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6glyf.html * "If a glyph has zero contours, it need not have any glyph data." set the pointCount to zero to initialize * attributes and avoid nullpointer but maybe there shouldn't have GlyphDescript in the GlyphData? */ diff --git a/library/src/main/java/com/tom_roush/fontbox/ttf/GlyphData.java b/library/src/main/java/com/tom_roush/fontbox/ttf/GlyphData.java index 9f61d439c..c02efe99a 100644 --- a/library/src/main/java/com/tom_roush/fontbox/ttf/GlyphData.java +++ b/library/src/main/java/com/tom_roush/fontbox/ttf/GlyphData.java @@ -21,7 +21,6 @@ import java.io.IOException; import com.tom_roush.fontbox.util.BoundingBox; - /** * A glyph data record in the glyf table. * @@ -43,9 +42,11 @@ public class GlyphData * @param glyphTable The glyph table this glyph belongs to. * @param data The stream to read the data from. * @param leftSideBearing The left side bearing for this glyph. + * @param level composite level * @throws IOException If there is an error reading the data. */ - void initData( GlyphTable glyphTable, TTFDataStream data, int leftSideBearing ) throws IOException + void initData( GlyphTable glyphTable, TTFDataStream data, int leftSideBearing, int level) + throws IOException { numberOfContours = data.readSignedShort(); xMin = data.readSignedShort(); @@ -63,7 +64,7 @@ void initData( GlyphTable glyphTable, TTFDataStream data, int leftSideBearing ) else { // create a composite glyph - glyphDescription = new GlyfCompositeDescript(data, glyphTable); + glyphDescription = new GlyfCompositeDescript(data, glyphTable, level + 1); } } diff --git a/library/src/main/java/com/tom_roush/fontbox/ttf/GlyphDescription.java b/library/src/main/java/com/tom_roush/fontbox/ttf/GlyphDescription.java index ad8c5a090..7b7697cfb 100644 --- a/library/src/main/java/com/tom_roush/fontbox/ttf/GlyphDescription.java +++ b/library/src/main/java/com/tom_roush/fontbox/ttf/GlyphDescription.java @@ -1,28 +1,27 @@ /* - - Licensed to the Apache Software Foundation (ASF) under one or more - contributor license agreements. See the NOTICE file distributed with - this work for additional information regarding copyright ownership. - The ASF licenses this file to You under the Apache License, Version 2.0 - (the "License"); you may not use this file except in compliance with - the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ package com.tom_roush.fontbox.ttf; + /** * Specifies access to glyph description classes, simple and composite. * - * This class is based on code from Apache Batik a subproject of Apache XMLGraphics. - * see http://xmlgraphics.apache.org/batik/ for further details. + * This class is based on code from Apache Batik, a subproject of Apache XMLGraphics. + * see The Apache™ Batik Project for further details. * */ public interface GlyphDescription diff --git a/library/src/main/java/com/tom_roush/fontbox/ttf/GlyphRenderer.java b/library/src/main/java/com/tom_roush/fontbox/ttf/GlyphRenderer.java index f882d7e29..c1bb2b730 100644 --- a/library/src/main/java/com/tom_roush/fontbox/ttf/GlyphRenderer.java +++ b/library/src/main/java/com/tom_roush/fontbox/ttf/GlyphRenderer.java @@ -24,7 +24,6 @@ import java.util.Locale; import com.tom_roush.pdfbox.android.PDFBoxConfig; - /** * This class provides a glyph to Path conversion for true type fonts. * Based on code from Apache Batik, a subproject of Apache XMLGraphics. @@ -40,6 +39,7 @@ */ class GlyphRenderer { + private GlyphDescription glyphDescription; GlyphRenderer(GlyphDescription glyphDescription) @@ -78,7 +78,7 @@ private Point[] describe(GlyphDescription gd) endPtOfContourIndex = -1; } points[i] = new Point(gd.getXCoordinate(i), gd.getYCoordinate(i), - (gd.getFlags(i) & GlyfDescript.ON_CURVE) != 0, endPt); + (gd.getFlags(i) & GlyfDescript.ON_CURVE) != 0, endPt); } return points; } @@ -100,7 +100,7 @@ private Path calculatePath(Point[] points) { Point firstPoint = points[start]; Point lastPoint = points[p]; - List contour = new ArrayList(); + List contour = new ArrayList((p - start) + 3); for (int q = start; q <= p; ++q) { contour.add(points[q]); @@ -171,7 +171,7 @@ private void quadTo(Path path, Point ctrlPoint, Point point) if (PDFBoxConfig.isDebugEnabled()) { Log.d("PdfBox-Android", "quadTo: " + String.format(Locale.US, "%d,%d %d,%d", ctrlPoint.x, ctrlPoint.y, - point.x, point.y)); + point.x, point.y)); } } @@ -214,7 +214,7 @@ private static class Point public String toString() { return String.format(Locale.US, "Point(%d,%d,%s,%s)", x, y, onCurve ? "onCurve" : "", - endOfContour ? "endOfContour" : ""); + endOfContour ? "endOfContour" : ""); } } diff --git a/library/src/main/java/com/tom_roush/fontbox/ttf/GlyphSubstitutionTable.java b/library/src/main/java/com/tom_roush/fontbox/ttf/GlyphSubstitutionTable.java index 16675ceb7..d3f80ca1b 100644 --- a/library/src/main/java/com/tom_roush/fontbox/ttf/GlyphSubstitutionTable.java +++ b/library/src/main/java/com/tom_roush/fontbox/ttf/GlyphSubstitutionTable.java @@ -30,7 +30,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; - +import java.util.regex.Pattern; /** * A glyph substitution 'GSUB' table in a TrueType or OpenType font. * @@ -38,6 +38,7 @@ */ public class GlyphSubstitutionTable extends TTFTable { + public static final String TAG = "GSUB"; private LinkedHashMap scriptList; @@ -50,6 +51,13 @@ public class GlyphSubstitutionTable extends TTFTable private String lastUsedSupportedScript; + /** + * The regex represents 4 'word characters' [a-zA-Z_0-9], + * see {@link java.util.regex.ASCII#WORD}
    + * Note: the ' '-character is not matched! + */ + private static final Pattern WORDPATTERN = Pattern.compile( "\\w{4}" ); + GlyphSubstitutionTable(TrueTypeFont font) { super(font); @@ -75,6 +83,8 @@ void read(TrueTypeFont ttf, TTFDataStream data) throws IOException scriptList = readScriptList(data, start + scriptListOffset); featureList = readFeatureList(data, start + featureListOffset); lookupList = readLookupList(data, start + lookupListOffset); + + initialized = true; } LinkedHashMap readScriptList(TTFDataStream data, long offset) throws IOException @@ -97,6 +107,11 @@ LinkedHashMap readScriptList(TTFDataStream data, long offse LinkedHashMap resultScriptList = new LinkedHashMap(scriptCount); for (ScriptRecord scriptRecord : scriptRecords) { + if (resultScriptList.get(scriptRecord.scriptTag) != null) + { + // PDFBOX-6146 + continue; + } resultScriptList.put(scriptRecord.scriptTag, scriptRecord.scriptTable); } return resultScriptList; @@ -120,7 +135,7 @@ ScriptTable readScriptTable(TTFDataStream data, long offset) throws IOException // PDFBOX-4489: catch corrupt file // https://docs.microsoft.com/en-us/typography/opentype/spec/chapter2#slTbl_sRec throw new IOException("LangSysRecords not alphabetically sorted by LangSys tag: " + - langSysRecord.langSysTag + " <= " + prevLangSysTag); + langSysRecord.langSysTag + " <= " + prevLangSysTag); } langSysOffsets[i] = data.readUnsignedShort(); langSysRecords[i] = langSysRecord; @@ -173,17 +188,18 @@ FeatureRecord[] readFeatureList(TTFDataStream data, long offset) throws IOExcept { // catch corrupt file // https://docs.microsoft.com/en-us/typography/opentype/spec/chapter2#flTbl - if (featureRecord.featureTag.matches("\\w{4}") && prevFeatureTag.matches("\\w{4}")) + if (WORDPATTERN.matcher(featureRecord.featureTag).matches() && + WORDPATTERN.matcher(prevFeatureTag).matches()) { // ArialUni.ttf has many warnings but isn't corrupt, so we assume that only // strings with trash characters indicate real corruption Log.d("PdfBox-Android", "FeatureRecord array not alphabetically sorted by FeatureTag: " + - featureRecord.featureTag + " < " + prevFeatureTag); + featureRecord.featureTag + " < " + prevFeatureTag); } else { Log.w("PdfBox-Android", "FeatureRecord array not alphabetically sorted by FeatureTag: " + - featureRecord.featureTag + " < " + prevFeatureTag); + featureRecord.featureTag + " < " + prevFeatureTag); return new FeatureRecord[0]; } } @@ -223,9 +239,16 @@ LookupTable[] readLookupList(TTFDataStream data, long offset) throws IOException lookups[i] = data.readUnsignedShort(); } LookupTable[] lookupTables = new LookupTable[lookupCount]; + Map lookupTableMap = new HashMap(); // PDFBOX-6146 for (int i = 0; i < lookupCount; i++) { - lookupTables[i] = readLookupTable(data, offset + lookups[i]); + LookupTable lookupTable = lookupTableMap.get(lookups[i]); + if (lookupTable == null) + { + lookupTable = readLookupTable(data, offset + lookups[i]); + lookupTableMap.put(lookups[i], lookupTable); + } + lookupTables[i] = lookupTable; } return lookupTables; } @@ -237,10 +260,10 @@ LookupTable readLookupTable(TTFDataStream data, long offset) throws IOException lookupTable.lookupType = data.readUnsignedShort(); lookupTable.lookupFlag = data.readUnsignedShort(); int subTableCount = data.readUnsignedShort(); - int[] subTableOffets = new int[subTableCount]; + int[] subTableOffsets = new int[subTableCount]; for (int i = 0; i < subTableCount; i++) { - subTableOffets[i] = data.readUnsignedShort(); + subTableOffsets[i] = data.readUnsignedShort(); } if ((lookupTable.lookupFlag & 0x0010) != 0) { @@ -249,15 +272,15 @@ LookupTable readLookupTable(TTFDataStream data, long offset) throws IOException lookupTable.subTables = new LookupSubTable[subTableCount]; switch (lookupTable.lookupType) { - case 1: // Single - for (int i = 0; i < subTableCount; i++) - { - lookupTable.subTables[i] = readLookupSubTable(data, offset + subTableOffets[i]); - } - break; - default: - // Other lookup types are not supported - Log.d("PdfBox-Android", "Type " + lookupTable.lookupType + " GSUB lookup table is not supported and will be ignored"); + case 1: // Single + for (int i = 0; i < subTableCount; i++) + { + lookupTable.subTables[i] = readLookupSubTable(data, offset + subTableOffsets[i]); + } + break; + default: + // Other lookup types are not supported + Log.d("PdfBox-Android", "Type " + lookupTable.lookupType + " GSUB lookup table is not supported and will be ignored"); } return lookupTable; } @@ -268,31 +291,32 @@ LookupSubTable readLookupSubTable(TTFDataStream data, long offset) throws IOExce int substFormat = data.readUnsignedShort(); switch (substFormat) { - case 1: - { - LookupTypeSingleSubstFormat1 lookupSubTable = new LookupTypeSingleSubstFormat1(); - lookupSubTable.substFormat = substFormat; - int coverageOffset = data.readUnsignedShort(); - lookupSubTable.deltaGlyphID = data.readSignedShort(); - lookupSubTable.coverageTable = readCoverageTable(data, offset + coverageOffset); - return lookupSubTable; - } - case 2: + case 1: + { + LookupTypeSingleSubstFormat1 lookupSubTable = new LookupTypeSingleSubstFormat1(); + lookupSubTable.substFormat = substFormat; + int coverageOffset = data.readUnsignedShort(); + lookupSubTable.deltaGlyphID = data.readSignedShort(); + lookupSubTable.coverageTable = readCoverageTable(data, offset + coverageOffset); + return lookupSubTable; + } + case 2: + { + LookupTypeSingleSubstFormat2 lookupSubTable = new LookupTypeSingleSubstFormat2(); + lookupSubTable.substFormat = substFormat; + int coverageOffset = data.readUnsignedShort(); + int glyphCount = data.readUnsignedShort(); + lookupSubTable.substituteGlyphIDs = new int[glyphCount]; + for (int i = 0; i < glyphCount; i++) { - LookupTypeSingleSubstFormat2 lookupSubTable = new LookupTypeSingleSubstFormat2(); - lookupSubTable.substFormat = substFormat; - int coverageOffset = data.readUnsignedShort(); - int glyphCount = data.readUnsignedShort(); - lookupSubTable.substituteGlyphIDs = new int[glyphCount]; - for (int i = 0; i < glyphCount; i++) - { - lookupSubTable.substituteGlyphIDs[i] = data.readUnsignedShort(); - } - lookupSubTable.coverageTable = readCoverageTable(data, offset + coverageOffset); - return lookupSubTable; + lookupSubTable.substituteGlyphIDs[i] = data.readUnsignedShort(); } - default: - throw new IOException("Unknown substFormat: " + substFormat); + lookupSubTable.coverageTable = readCoverageTable(data, offset + coverageOffset); + return lookupSubTable; + } + default: + Log.w("PdfBox-Android", "Unknown substFormat: " + substFormat); + return null; } } @@ -302,34 +326,34 @@ CoverageTable readCoverageTable(TTFDataStream data, long offset) throws IOExcept int coverageFormat = data.readUnsignedShort(); switch (coverageFormat) { - case 1: + case 1: + { + CoverageTableFormat1 coverageTable = new CoverageTableFormat1(); + coverageTable.coverageFormat = coverageFormat; + int glyphCount = data.readUnsignedShort(); + coverageTable.glyphArray = new int[glyphCount]; + for (int i = 0; i < glyphCount; i++) { - CoverageTableFormat1 coverageTable = new CoverageTableFormat1(); - coverageTable.coverageFormat = coverageFormat; - int glyphCount = data.readUnsignedShort(); - coverageTable.glyphArray = new int[glyphCount]; - for (int i = 0; i < glyphCount; i++) - { - coverageTable.glyphArray[i] = data.readUnsignedShort(); - } - return coverageTable; + coverageTable.glyphArray[i] = data.readUnsignedShort(); } - case 2: + return coverageTable; + } + case 2: + { + CoverageTableFormat2 coverageTable = new CoverageTableFormat2(); + coverageTable.coverageFormat = coverageFormat; + int rangeCount = data.readUnsignedShort(); + coverageTable.rangeRecords = new RangeRecord[rangeCount]; + for (int i = 0; i < rangeCount; i++) { - CoverageTableFormat2 coverageTable = new CoverageTableFormat2(); - coverageTable.coverageFormat = coverageFormat; - int rangeCount = data.readUnsignedShort(); - coverageTable.rangeRecords = new RangeRecord[rangeCount]; - for (int i = 0; i < rangeCount; i++) - { - coverageTable.rangeRecords[i] = readRangeRecord(data); - } - return coverageTable; - + coverageTable.rangeRecords[i] = readRangeRecord(data); } - default: - // Should not happen (the spec indicates only format 1 and format 2) - throw new IOException("Unknown coverage format: " + coverageFormat); + return coverageTable; + + } + default: + // Should not happen (the spec indicates only format 1 and format 2) + throw new IOException("Unknown coverage format: " + coverageFormat); } } @@ -347,7 +371,7 @@ private String selectScriptTag(String[] tags) { String tag = tags[0]; if (OpenTypeScript.INHERITED.equals(tag) - || (OpenTypeScript.TAG_DEFAULT.equals(tag) && !scriptList.containsKey(tag))) + || (OpenTypeScript.TAG_DEFAULT.equals(tag) && !scriptList.containsKey(tag))) { // We don't know what script this should be. if (lastUsedSupportedScript == null) @@ -406,7 +430,7 @@ private Collection getLangSysTables(String scriptTag) * @return The indicated {@code FeatureRecord}s */ private List getFeatureRecords(Collection langSysTables, - final List enabledFeatures) + final List enabledFeatures) { if (langSysTables.isEmpty()) { @@ -423,8 +447,8 @@ private List getFeatureRecords(Collection langSysTa for (int featureIndex : langSysTable.featureIndices) { if (featureIndex < featureList.length && - (enabledFeatures == null || - enabledFeatures.contains(featureList[featureIndex].featureTag))) + (enabledFeatures == null || + enabledFeatures.contains(featureList[featureIndex].featureTag))) { result.add(featureList[featureIndex]); } @@ -487,7 +511,7 @@ private int applyFeature(FeatureRecord featureRecord, int gid) if (lookupTable.lookupType != 1) { Log.d("PdfBox-Android", "Skipping GSUB feature '" + featureRecord.featureTag - + "' because it requires unsupported lookup table type " + lookupTable.lookupType); + + "' because it requires unsupported lookup table type " + lookupTable.lookupType); continue; } gid = doLookup(lookupTable, gid); @@ -531,7 +555,7 @@ public int getSubstitution(int gid, String[] scriptTags, List enabledFea if (cached != null) { // Because script detection for indeterminate scripts (COMMON, INHERIT, etc.) depends on context, - // it is possible to return a different substitution for the same input. However we don't want that, + // it is possible to return a different substitution for the same input. However, we don't want that, // as we need a one-to-one mapping. return cached; } @@ -549,13 +573,15 @@ public int getSubstitution(int gid, String[] scriptTags, List enabledFea } /** - * For a substitute-gid (obtained from {@link #getSubstitution(int, String[], List)}), retrieve - * the original gid. - * - * Only gids previously substituted by this instance can be un-substituted. If you are trying to - * unsubstitute before you substitute, something is wrong. + * For a substitute-gid (obtained from {@link #getSubstitution(int, String[], List)}), + * retrieve the original gid. + *

    + * Only gids previously substituted by this instance can be un-substituted. + * If you are trying to unsubstitute before you substitute, something is wrong. * * @param sgid Substitute GID + * + * @return the original gid of a substitute-gid */ public int getUnsubstitution(int sgid) { @@ -599,7 +625,7 @@ static class ScriptTable public String toString() { return String.format("ScriptTable[hasDefault=%s,langSysRecordsCount=%d]", - defaultLangSysTable != null, langSysTables.size()); + defaultLangSysTable != null, langSysTables.size()); } } @@ -647,8 +673,8 @@ static class FeatureTable @Override public String toString() { - return String.format("FeatureTable[lookupListIndiciesCount=%d]", - lookupListIndices.length); + return String.format("FeatureTable[lookupListIndicesCount=%d]", + lookupListIndices.length); } } @@ -663,7 +689,7 @@ static class LookupTable public String toString() { return String.format("LookupTable[lookupType=%d,lookupFlag=%d,markFilteringSet=%d]", - lookupType, lookupFlag, markFilteringSet); + lookupType, lookupFlag, markFilteringSet); } } @@ -689,7 +715,7 @@ int doSubstitution(int gid, int coverageIndex) public String toString() { return String.format("LookupTypeSingleSubstFormat1[substFormat=%d,deltaGlyphID=%d]", - substFormat, deltaGlyphID); + substFormat, deltaGlyphID); } } @@ -707,8 +733,8 @@ int doSubstitution(int gid, int coverageIndex) public String toString() { return String.format( - "LookupTypeSingleSubstFormat2[substFormat=%d,substituteGlyphIDs=%s]", - substFormat, Arrays.toString(substituteGlyphIDs)); + "LookupTypeSingleSubstFormat2[substFormat=%d,substituteGlyphIDs=%s]", + substFormat, Arrays.toString(substituteGlyphIDs)); } } @@ -733,7 +759,7 @@ int getCoverageIndex(int gid) public String toString() { return String.format("CoverageTableFormat1[coverageFormat=%d,glyphArray=%s]", - coverageFormat, Arrays.toString(glyphArray)); + coverageFormat, Arrays.toString(glyphArray)); } } @@ -771,7 +797,7 @@ static class RangeRecord public String toString() { return String.format("RangeRecord[startGlyphID=%d,endGlyphID=%d,startCoverageIndex=%d]", - startGlyphID, endGlyphID, startCoverageIndex); + startGlyphID, endGlyphID, startCoverageIndex); } } } diff --git a/library/src/main/java/com/tom_roush/fontbox/ttf/GlyphTable.java b/library/src/main/java/com/tom_roush/fontbox/ttf/GlyphTable.java index f0d5cb706..337977c9c 100644 --- a/library/src/main/java/com/tom_roush/fontbox/ttf/GlyphTable.java +++ b/library/src/main/java/com/tom_roush/fontbox/ttf/GlyphTable.java @@ -17,7 +17,6 @@ package com.tom_roush.fontbox.ttf; import java.io.IOException; - /** * A table in a true type font. * @@ -40,6 +39,7 @@ public class GlyphTable extends TTFTable private int cached = 0; private HorizontalMetricsTable hmt = null; + private MaximumProfileTable maxp = null; /** * Don't even bother to cache huge fonts. @@ -83,6 +83,8 @@ void read(TrueTypeFont ttf, TTFDataStream data) throws IOException // locks TrueTypeFont and then tries to lock "data" hmt = font.getHorizontalMetrics(); + maxp = ttf.getMaximumProfile(); + initialized = true; } @@ -139,7 +141,7 @@ public GlyphData[] getGlyphs() throws IOException { ++cached; } - glyphs[gid] = getGlyphData(gid); + glyphs[gid] = getGlyphData(gid, 0); } initialized = true; return glyphs; @@ -161,6 +163,11 @@ public void setGlyphs(GlyphData[] glyphsValue) * @throws IOException if the font cannot be read */ public GlyphData getGlyph(int gid) throws IOException + { + return getGlyph(gid, 0); + } + + GlyphData getGlyph(int gid, int level) throws IOException { if (gid < 0 || gid >= numGlyphs) { @@ -181,11 +188,12 @@ public GlyphData getGlyph(int gid) throws IOException // read a single glyph long[] offsets = loca.getOffsets(); - if (offsets[gid] == offsets[gid + 1]) + if (offsets[gid] == offsets[gid + 1] || offsets[gid] == data.getOriginalDataSize()) { // no outline // PDFBOX-5135: can't return null, must return an empty glyph because // sometimes this is used in a composite glyph. + // PDFBOX-5917: offset points to end of the stream glyph = new GlyphData(); glyph.initEmptyData(); } @@ -196,7 +204,7 @@ public GlyphData getGlyph(int gid) throws IOException data.seek(getOffset() + offsets[gid]); - glyph = getGlyphData(gid); + glyph = getGlyphData(gid, level); // restore data.seek(currentPosition); @@ -212,11 +220,15 @@ public GlyphData getGlyph(int gid) throws IOException } } - private GlyphData getGlyphData(int gid) throws IOException + private GlyphData getGlyphData(int gid, int level) throws IOException { + if (level > maxp.getMaxComponentDepth()) + { + throw new IOException("composite glyph maximum level (" + maxp.getMaxComponentDepth() + ") reached"); + } GlyphData glyph = new GlyphData(); int leftSideBearing = hmt == null ? 0 : hmt.getLeftSideBearing(gid); - glyph.initData(this, data, leftSideBearing); + glyph.initData(this, data, leftSideBearing, level); // resolve composite glyph if (glyph.getDescription().isComposite()) { diff --git a/library/src/main/java/com/tom_roush/fontbox/ttf/IndexToLocationTable.java b/library/src/main/java/com/tom_roush/fontbox/ttf/IndexToLocationTable.java index 69774eef7..81cb86331 100644 --- a/library/src/main/java/com/tom_roush/fontbox/ttf/IndexToLocationTable.java +++ b/library/src/main/java/com/tom_roush/fontbox/ttf/IndexToLocationTable.java @@ -17,7 +17,6 @@ package com.tom_roush.fontbox.ttf; import java.io.IOException; - /** * A table in a true type font. * @@ -71,6 +70,11 @@ else if( head.getIndexToLocFormat() == LONG_OFFSETS ) throw new IOException( "Error:TTF.loca unknown offset format."); } } + if (numGlyphs == 1 && offsets[0] == 0 && offsets[1] == 0) + { + // PDFBOX-5794 empty glyph + throw new IOException("The font has no glyphs"); + } initialized = true; } /** diff --git a/library/src/main/java/com/tom_roush/fontbox/ttf/KerningSubtable.java b/library/src/main/java/com/tom_roush/fontbox/ttf/KerningSubtable.java index 5b9ad665d..174120594 100644 --- a/library/src/main/java/com/tom_roush/fontbox/ttf/KerningSubtable.java +++ b/library/src/main/java/com/tom_roush/fontbox/ttf/KerningSubtable.java @@ -21,7 +21,6 @@ import java.io.IOException; import java.util.Arrays; import java.util.Comparator; - /** * A 'kern' table in a true type font. * @@ -29,6 +28,7 @@ */ public class KerningSubtable { + // coverage field bit masks and values private static final int COVERAGE_HORIZONTAL = 0x0001; private static final int COVERAGE_MINIMUMS = 0x0002; @@ -185,8 +185,8 @@ private void readSubtable0(TTFDataStream data) throws IOException int length = data.readUnsignedShort(); if (length < 6) { - throw new IOException("Kerning sub-table too short, got " + length - + " bytes, expect 6 or more."); + Log.w("PdfBox-Android", "Kerning sub-table too short, got " + length + " bytes, expect 6 or more."); + return; } int coverage = data.readUnsignedShort(); if (isBitsSet(coverage, COVERAGE_HORIZONTAL, COVERAGE_HORIZONTAL_SHIFT)) @@ -251,14 +251,13 @@ private interface PairData private static class PairData0Format0 implements Comparator, PairData { - private int searchRange; private int[][] pairs; @Override public void read(TTFDataStream data) throws IOException { int numPairs = data.readUnsignedShort(); - searchRange = data.readUnsignedShort()/6; + int searchRange = data.readUnsignedShort()/6; int entrySelector = data.readUnsignedShort(); int rangeShift = data.readUnsignedShort(); pairs = new int[numPairs][3]; @@ -288,10 +287,6 @@ public int getKerning(int l, int r) @Override public int compare(int[] p1, int[] p2) { - assert p1 != null; - assert p1.length >= 2; - assert p2 != null; - assert p2.length >= 2; int l1 = p1[0]; int l2 = p2[0]; if (l1 < l2) diff --git a/library/src/main/java/com/tom_roush/fontbox/ttf/MaximumProfileTable.java b/library/src/main/java/com/tom_roush/fontbox/ttf/MaximumProfileTable.java index 521fca446..0676abd3c 100644 --- a/library/src/main/java/com/tom_roush/fontbox/ttf/MaximumProfileTable.java +++ b/library/src/main/java/com/tom_roush/fontbox/ttf/MaximumProfileTable.java @@ -17,7 +17,6 @@ package com.tom_roush.fontbox.ttf; import java.io.IOException; - /** * A table in a true type font. * @@ -274,19 +273,27 @@ void read(TrueTypeFont ttf, TTFDataStream data) throws IOException { version = data.read32Fixed(); numGlyphs = data.readUnsignedShort(); - maxPoints = data.readUnsignedShort(); - maxContours = data.readUnsignedShort(); - maxCompositePoints = data.readUnsignedShort(); - maxCompositeContours = data.readUnsignedShort(); - maxZones = data.readUnsignedShort(); - maxTwilightPoints = data.readUnsignedShort(); - maxStorage = data.readUnsignedShort(); - maxFunctionDefs = data.readUnsignedShort(); - maxInstructionDefs = data.readUnsignedShort(); - maxStackElements = data.readUnsignedShort(); - maxSizeOfInstructions = data.readUnsignedShort(); - maxComponentElements = data.readUnsignedShort(); - maxComponentDepth = data.readUnsignedShort(); + if (version >= 1.0f) + { + maxPoints = data.readUnsignedShort(); + maxContours = data.readUnsignedShort(); + maxCompositePoints = data.readUnsignedShort(); + maxCompositeContours = data.readUnsignedShort(); + maxZones = data.readUnsignedShort(); + maxTwilightPoints = data.readUnsignedShort(); + maxStorage = data.readUnsignedShort(); + maxFunctionDefs = data.readUnsignedShort(); + maxInstructionDefs = data.readUnsignedShort(); + maxStackElements = data.readUnsignedShort(); + maxSizeOfInstructions = data.readUnsignedShort(); + maxComponentElements = data.readUnsignedShort(); + maxComponentDepth = data.readUnsignedShort(); + if (maxComponentDepth == 0) + { + // PDFBOX-6105 + maxComponentDepth = 1; + } + } initialized = true; } } diff --git a/library/src/main/java/com/tom_roush/fontbox/ttf/MemoryTTFDataStream.java b/library/src/main/java/com/tom_roush/fontbox/ttf/MemoryTTFDataStream.java index 86c7b6973..5c7b29cb3 100644 --- a/library/src/main/java/com/tom_roush/fontbox/ttf/MemoryTTFDataStream.java +++ b/library/src/main/java/com/tom_roush/fontbox/ttf/MemoryTTFDataStream.java @@ -21,7 +21,6 @@ import java.io.EOFException; import java.io.IOException; import java.io.InputStream; - /** * An interface into a data stream. * @@ -34,7 +33,7 @@ class MemoryTTFDataStream extends TTFDataStream private int currentPosition = 0; /** - * Constructor from a stream. + * Constructor from a stream. * @param is The stream to read from. It will be closed by this method. * @throws IOException If an error occurs while reading from the stream. */ @@ -42,7 +41,13 @@ class MemoryTTFDataStream extends TTFDataStream { try { - ByteArrayOutputStream output = new ByteArrayOutputStream( is.available() ); + int available = is.available(); + if (available > Integer.MAX_VALUE - 8) // https://www.baeldung.com/java-arrays-max-size + { + // PDFBOX-5991 + throw new IOException("Stream is too long, size: " + available); + } + ByteArrayOutputStream output = new ByteArrayOutputStream(available); byte[] buffer = new byte[1024]; int amountRead; while( (amountRead = is.read( buffer ) ) != -1 ) @@ -179,10 +184,10 @@ public void seek(long pos) throws IOException */ @Override public int read(byte[] b, - int off, - int len) - throws IOException - { + int off, + int len) + throws IOException + { if (currentPosition < data.length) { int amountRead = Math.min( len, data.length-currentPosition ); @@ -194,7 +199,7 @@ public int read(byte[] b, { return -1; } - } + } /** * Get the current position in the stream. diff --git a/library/src/main/java/com/tom_roush/fontbox/ttf/NameRecord.java b/library/src/main/java/com/tom_roush/fontbox/ttf/NameRecord.java index ceeee98f4..594bf59a6 100644 --- a/library/src/main/java/com/tom_roush/fontbox/ttf/NameRecord.java +++ b/library/src/main/java/com/tom_roush/fontbox/ttf/NameRecord.java @@ -17,7 +17,6 @@ package com.tom_roush.fontbox.ttf; import java.io.IOException; - /** * A name record in the name table. * @@ -39,7 +38,7 @@ public class NameRecord // Unicode encoding ids /** - * @deprecated use {@link #LANGUAGE_UNICODE} instead. + * @deprecated use {@link #LANGUAGE_UNICODE} instead. */ @Deprecated public static final int LANGUGAE_UNICODE = 0; @@ -52,7 +51,7 @@ public class NameRecord // Windows language ids /** - * @deprecated use {@link #LANGUAGE_WINDOWS_EN_US} instead. + * @deprecated use {@link #LANGUAGE_WINDOWS_EN_US} instead. */ @Deprecated public static final int LANGUGAE_WINDOWS_EN_US = 0x0409; @@ -63,7 +62,7 @@ public class NameRecord // Macintosh language ids /** - * @deprecated use {@link #LANGUAGE_MACINTOSH_ENGLISH} instead. + * @deprecated use {@link #LANGUAGE_MACINTOSH_ENGLISH} instead. */ @Deprecated public static final int LANGUGAE_MACINTOSH_ENGLISH = 0; @@ -195,14 +194,15 @@ void initData( TrueTypeFont ttf, TTFDataStream data ) throws IOException * * @return A string for this class. */ + @Override public String toString() { return "platform=" + platformId + - " pEncoding=" + platformEncodingId + - " language=" + languageId + - " name=" + nameId + - " " + string; + " pEncoding=" + platformEncodingId + + " language=" + languageId + + " name=" + nameId + + " " + string; } /** * @return Returns the string. diff --git a/library/src/main/java/com/tom_roush/fontbox/ttf/NamingTable.java b/library/src/main/java/com/tom_roush/fontbox/ttf/NamingTable.java index 2b710d6d0..c4db30c52 100644 --- a/library/src/main/java/com/tom_roush/fontbox/ttf/NamingTable.java +++ b/library/src/main/java/com/tom_roush/fontbox/ttf/NamingTable.java @@ -24,7 +24,6 @@ import java.util.Map; import com.tom_roush.fontbox.util.Charsets; - /** * A table in a true type font. * @@ -80,42 +79,22 @@ void read(TrueTypeFont ttf, TTFDataStream data) throws IOException continue; } - data.seek(getOffset() + (2*3)+numberOfNameRecords*2*6+nr.getStringOffset()); - int platform = nr.getPlatformId(); - int encoding = nr.getPlatformEncodingId(); - Charset charset = Charsets.ISO_8859_1; - if (platform == NameRecord.PLATFORM_WINDOWS && (encoding == NameRecord.ENCODING_WINDOWS_SYMBOL || encoding == NameRecord.ENCODING_WINDOWS_UNICODE_BMP)) - { - charset = Charsets.UTF_16; - } - else if (platform == NameRecord.PLATFORM_UNICODE) - { - charset = Charsets.UTF_16; - } - else if (platform == NameRecord.PLATFORM_ISO) - { - switch (encoding) - { - case 0: - charset = Charsets.US_ASCII; - break; - case 1: - //not sure is this is correct?? - charset = Charsets.ISO_10646; - break; - case 2: - charset = Charsets.ISO_8859_1; - break; - default: - break; - } - } + data.seek(getOffset() + (2*3L)+numberOfNameRecords*2*6+nr.getStringOffset()); + Charset charset = getCharset(nr); String string = data.readString(nr.getStringLength(), charset); nr.setString(string); } - // build multi-dimensional lookup table lookupTable = new HashMap>>>(nameRecords.size()); + fillLookupTable(); + readInterestingStrings(); + + initialized = true; + } + + private void fillLookupTable() + { + // build multi-dimensional lookup table for (NameRecord nr : nameRecords) { // name id @@ -136,35 +115,66 @@ else if (platform == NameRecord.PLATFORM_ISO) Map languageLookup = encodingLookup.get(nr.getPlatformEncodingId()); if (languageLookup == null) { - languageLookup = new HashMap(); + languageLookup = new HashMap(1); encodingLookup.put(nr.getPlatformEncodingId(), languageLookup); } // language id / string languageLookup.put(nr.getLanguageId(), nr.getString()); } + } - // extract strings of interest + private Charset getCharset(NameRecord nr) + { + int platform = nr.getPlatformId(); + int encoding = nr.getPlatformEncodingId(); + Charset charset = Charsets.ISO_8859_1; + if (platform == NameRecord.PLATFORM_WINDOWS && (encoding == NameRecord.ENCODING_WINDOWS_SYMBOL || encoding == NameRecord.ENCODING_WINDOWS_UNICODE_BMP)) + { + charset = Charsets.UTF_16; + } + else if (platform == NameRecord.PLATFORM_UNICODE) + { + charset = Charsets.UTF_16; + } + else if (platform == NameRecord.PLATFORM_ISO) + { + switch (encoding) + { + case 0: + charset = Charsets.US_ASCII; + break; + case 1: + //not sure is this is correct?? + charset = Charsets.ISO_10646; + break; + default: + break; + } + } + return charset; + } + + private void readInterestingStrings() + { fontFamily = getEnglishName(NameRecord.NAME_FONT_FAMILY_NAME); fontSubFamily = getEnglishName(NameRecord.NAME_FONT_SUB_FAMILY_NAME); // extract PostScript name, only these two formats are valid psName = getName(NameRecord.NAME_POSTSCRIPT_NAME, - NameRecord.PLATFORM_MACINTOSH, - NameRecord.ENCODING_MACINTOSH_ROMAN, - NameRecord.LANGUAGE_MACINTOSH_ENGLISH); + NameRecord.PLATFORM_MACINTOSH, + NameRecord.ENCODING_MACINTOSH_ROMAN, + NameRecord.LANGUAGE_MACINTOSH_ENGLISH); if (psName == null) { psName = getName(NameRecord.NAME_POSTSCRIPT_NAME, - NameRecord.PLATFORM_WINDOWS, - NameRecord.ENCODING_WINDOWS_UNICODE_BMP, - NameRecord.LANGUAGE_WINDOWS_EN_US); + NameRecord.PLATFORM_WINDOWS, + NameRecord.ENCODING_WINDOWS_UNICODE_BMP, + NameRecord.LANGUAGE_WINDOWS_EN_US); } if (psName != null) { psName = psName.trim(); } - - initialized = true; } /** @@ -176,10 +186,10 @@ private String getEnglishName(int nameId) for (int i = 4; i >= 0; i--) { String nameUni = - getName(nameId, - NameRecord.PLATFORM_UNICODE, - i, - NameRecord.LANGUAGE_UNICODE); + getName(nameId, + NameRecord.PLATFORM_UNICODE, + i, + NameRecord.LANGUAGE_UNICODE); if (nameUni != null) { return nameUni; @@ -188,10 +198,10 @@ private String getEnglishName(int nameId) // Windows, Unicode BMP, EN-US String nameWin = - getName(nameId, - NameRecord.PLATFORM_WINDOWS, - NameRecord.ENCODING_WINDOWS_UNICODE_BMP, - NameRecord.LANGUAGE_WINDOWS_EN_US); + getName(nameId, + NameRecord.PLATFORM_WINDOWS, + NameRecord.ENCODING_WINDOWS_UNICODE_BMP, + NameRecord.LANGUAGE_WINDOWS_EN_US); if (nameWin != null) { return nameWin; @@ -199,13 +209,13 @@ private String getEnglishName(int nameId) // Macintosh, Roman, English return getName(nameId, - NameRecord.PLATFORM_MACINTOSH, - NameRecord.ENCODING_MACINTOSH_ROMAN, - NameRecord.LANGUAGE_MACINTOSH_ENGLISH); + NameRecord.PLATFORM_MACINTOSH, + NameRecord.ENCODING_MACINTOSH_ROMAN, + NameRecord.LANGUAGE_MACINTOSH_ENGLISH); } /** - * Returns a name from the table, or null it it does not exist. + * Returns a name from the table, or null if it does not exist. * * @param nameId Name ID from NameRecord constants. * @param platformId Platform ID from NameRecord constants. diff --git a/library/src/main/java/com/tom_roush/fontbox/ttf/OpenTypeFont.java b/library/src/main/java/com/tom_roush/fontbox/ttf/OpenTypeFont.java index 8937da566..27065e717 100644 --- a/library/src/main/java/com/tom_roush/fontbox/ttf/OpenTypeFont.java +++ b/library/src/main/java/com/tom_roush/fontbox/ttf/OpenTypeFont.java @@ -20,7 +20,6 @@ import android.graphics.Path; import java.io.IOException; - /** * An OpenType (OTF/TTF) font. */ @@ -81,7 +80,25 @@ public Path getPath(String name) throws IOException */ public boolean isPostScript() { - return tables.containsKey(CFFTable.TAG); + return isPostScript || tables.containsKey(CFFTable.TAG) || tables.containsKey("CFF2"); + } + + /** + * Returns true if this font is supported. + * + * There are 3 kind of OpenType fonts, fonts using TrueType outlines, fonts using CFF outlines (version 1 and 2) + * + * Fonts using CFF outlines version 2 aren't supported yet. + * + * @return true if the font is supported + */ + public boolean isSupportedOTF() + { + // OTF using CFF2 based outlines aren't yet supported + return !(isPostScript // + && !tables.containsKey(CFFTable.TAG) // + && tables.containsKey("CFF2") // + ); } /** @@ -90,9 +107,9 @@ public boolean isPostScript() public boolean hasLayoutTables() { return tables.containsKey("BASE") || - tables.containsKey("GDEF") || - tables.containsKey("GPOS") || - tables.containsKey("GSUB") || - tables.containsKey("JSTF"); + tables.containsKey("GDEF") || + tables.containsKey("GPOS") || + tables.containsKey("GSUB") || + tables.containsKey("JSTF"); } } diff --git a/library/src/main/java/com/tom_roush/fontbox/ttf/OpenTypeScript.java b/library/src/main/java/com/tom_roush/fontbox/ttf/OpenTypeScript.java index feabbbeba..129c3a893 100644 --- a/library/src/main/java/com/tom_roush/fontbox/ttf/OpenTypeScript.java +++ b/library/src/main/java/com/tom_roush/fontbox/ttf/OpenTypeScript.java @@ -26,13 +26,12 @@ import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; -import java.util.Map; import java.util.Map.Entry; +import java.util.Map; import java.util.StringTokenizer; import java.util.TreeMap; import com.tom_roush.pdfbox.android.PDFBoxResourceLoader; - /** * A class for mapping Unicode codepoints to OpenType script tags * @@ -44,6 +43,7 @@ */ public final class OpenTypeScript { + public static final String INHERITED = "Inherited"; public static final String UNKNOWN = "Unknown"; public static final String TAG_DEFAULT = "DFLT"; @@ -61,150 +61,150 @@ public final class OpenTypeScript static { Object[][] table = - { - {"Adlam", new String[] { "adlm" }}, - {"Ahom", new String[] { "ahom" }}, - {"Anatolian_Hieroglyphs", new String[] { "hluw" }}, - {"Arabic", new String[] { "arab" }}, - {"Armenian", new String[] { "armn" }}, - {"Avestan", new String[] { "avst" }}, - {"Balinese", new String[] { "bali" }}, - {"Bamum", new String[] { "bamu" }}, - {"Bassa_Vah", new String[] { "bass" }}, - {"Batak", new String[] { "batk" }}, - {"Bengali", new String[] { "bng2", "beng" }}, - {"Bhaiksuki", new String[] { "bhks" }}, - {"Bopomofo", new String[] { "bopo" }}, - {"Brahmi", new String[] { "brah" }}, - {"Braille", new String[] { "brai" }}, - {"Buginese", new String[] { "bugi" }}, - {"Buhid", new String[] { "buhd" }}, - // Byzantine Music: byzm - {"Canadian_Aboriginal", new String[] { "cans" }}, - {"Carian", new String[] { "cari" }}, - {"Caucasian_Albanian", new String[] { "aghb" }}, - {"Chakma", new String[] { "cakm" }}, - {"Cham", new String[] { "cham" }}, - {"Cherokee", new String[] { "cher" }}, - {"Common", new String[] { TAG_DEFAULT }}, // "Default" in OpenType - {"Coptic", new String[] { "copt" }}, - {"Cuneiform", new String[] { "xsux" }}, // "Sumero-Akkadian Cuneiform" in OpenType - {"Cypriot", new String[] { "cprt" }}, - {"Cyrillic", new String[] { "cyrl" }}, - {"Deseret", new String[] { "dsrt" }}, - {"Devanagari", new String[] { "dev2", "deva" }}, - {"Duployan", new String[] { "dupl" }}, - {"Egyptian_Hieroglyphs", new String[] { "egyp" }}, - {"Elbasan", new String[] { "elba" }}, - {"Ethiopic", new String[] { "ethi" }}, - {"Georgian", new String[] { "geor" }}, - {"Glagolitic", new String[] { "glag" }}, - {"Gothic", new String[] { "goth" }}, - {"Grantha", new String[] { "gran" }}, - {"Greek", new String[] { "grek" }}, - {"Gujarati", new String[] { "gjr2", "gujr" }}, - {"Gurmukhi", new String[] { "gur2", "guru" }}, - {"Han", new String[] { "hani" }}, // "CJK Ideographic" in OpenType - {"Hangul", new String[] { "hang" }}, - // Hangul Jamo: jamo - {"Hanunoo", new String[] { "hano" }}, - {"Hatran", new String[] { "hatr" }}, - {"Hebrew", new String[] { "hebr" }}, - {"Hiragana", new String[] { "kana" }}, - {"Imperial_Aramaic", new String[] { "armi" }}, - {INHERITED, new String[] { INHERITED }}, - {"Inscriptional_Pahlavi", new String[] { "phli" }}, - {"Inscriptional_Parthian", new String[] { "prti" }}, - {"Javanese", new String[] { "java" }}, - {"Kaithi", new String[] { "kthi" }}, - {"Kannada", new String[] { "knd2", "knda" }}, - {"Katakana", new String[] { "kana" }}, - {"Kayah_Li", new String[] { "kali" }}, - {"Kharoshthi", new String[] { "khar" }}, - {"Khmer", new String[] { "khmr" }}, - {"Khojki", new String[] { "khoj" }}, - {"Khudawadi", new String[] { "sind" }}, - {"Lao", new String[] { "lao " }}, - {"Latin", new String[] { "latn" }}, - {"Lepcha", new String[] { "lepc" }}, - {"Limbu", new String[] { "limb" }}, - {"Linear_A", new String[] { "lina" }}, - {"Linear_B", new String[] { "linb" }}, - {"Lisu", new String[] { "lisu" }}, - {"Lycian", new String[] { "lyci" }}, - {"Lydian", new String[] { "lydi" }}, - {"Mahajani", new String[] { "mahj" }}, - {"Malayalam", new String[] { "mlm2", "mlym" }}, - {"Mandaic", new String[] { "mand" }}, - {"Manichaean", new String[] { "mani" }}, - {"Marchen", new String[] { "marc" }}, - // Mathematical Alphanumeric Symbols: math - {"Meetei_Mayek", new String[] { "mtei" }}, - {"Mende_Kikakui", new String[] { "mend" }}, - {"Meroitic_Cursive", new String[] { "merc" }}, - {"Meroitic_Hieroglyphs", new String[] { "mero" }}, - {"Miao", new String[] { "plrd" }}, - {"Modi", new String[] { "modi" }}, - {"Mongolian", new String[] { "mong" }}, - {"Mro", new String[] { "mroo" }}, - {"Multani", new String[] { "mult" }}, - // Musical Symbols: musc - {"Myanmar", new String[] { "mym2", "mymr" }}, - {"Nabataean", new String[] { "nbat" }}, - {"Newa", new String[] { "newa" }}, - {"New_Tai_Lue", new String[] { "talu" }}, - {"Nko", new String[] { "nko " }}, - {"Ogham", new String[] { "ogam" }}, - {"Ol_Chiki", new String[] { "olck" }}, - {"Old_Italic", new String[] { "ital" }}, - {"Old_Hungarian", new String[] { "hung" }}, - {"Old_North_Arabian", new String[] { "narb" }}, - {"Old_Permic", new String[] { "perm" }}, - {"Old_Persian", new String[] { "xpeo" }}, - {"Old_South_Arabian", new String[] { "sarb" }}, - {"Old_Turkic", new String[] { "orkh" }}, - {"Oriya", new String[] { "ory2", "orya" }}, // "Odia (formerly Oriya)" in OpenType - {"Osage", new String[] { "osge" }}, - {"Osmanya", new String[] { "osma" }}, - {"Pahawh_Hmong", new String[] { "hmng" }}, - {"Palmyrene", new String[] { "palm" }}, - {"Pau_Cin_Hau", new String[] { "pauc" }}, - {"Phags_Pa", new String[] { "phag" }}, - {"Phoenician", new String[] { "phnx" }}, - {"Psalter_Pahlavi", new String[] { "phlp" }}, - {"Rejang", new String[] { "rjng" }}, - {"Runic", new String[] { "runr" }}, - {"Samaritan", new String[] { "samr" }}, - {"Saurashtra", new String[] { "saur" }}, - {"Sharada", new String[] { "shrd" }}, - {"Shavian", new String[] { "shaw" }}, - {"Siddham", new String[] { "sidd" }}, - {"SignWriting", new String[] { "sgnw" }}, - {"Sinhala", new String[] { "sinh" }}, - {"Sora_Sompeng", new String[] { "sora" }}, - {"Sundanese", new String[] { "sund" }}, - {"Syloti_Nagri", new String[] { "sylo" }}, - {"Syriac", new String[] { "syrc" }}, - {"Tagalog", new String[] { "tglg" }}, - {"Tagbanwa", new String[] { "tagb" }}, - {"Tai_Le", new String[] { "tale" }}, - {"Tai_Tham", new String[] { "lana" }}, - {"Tai_Viet", new String[] { "tavt" }}, - {"Takri", new String[] { "takr" }}, - {"Tamil", new String[] { "tml2", "taml" }}, - {"Tangut", new String[] { "tang" }}, - {"Telugu", new String[] { "tel2", "telu" }}, - {"Thaana", new String[] { "thaa" }}, - {"Thai", new String[] { "thai" }}, - {"Tibetan", new String[] { "tibt" }}, - {"Tifinagh", new String[] { "tfng" }}, - {"Tirhuta", new String[] { "tirh" }}, - {"Ugaritic", new String[] { "ugar" }}, - {UNKNOWN, new String[] { TAG_DEFAULT }}, - {"Vai", new String[] { "vai " }}, - {"Warang_Citi", new String[] { "wara" }}, - {"Yi", new String[] { "yi " }} - }; + { + {"Adlam", new String[] { "adlm" }}, + {"Ahom", new String[] { "ahom" }}, + {"Anatolian_Hieroglyphs", new String[] { "hluw" }}, + {"Arabic", new String[] { "arab" }}, + {"Armenian", new String[] { "armn" }}, + {"Avestan", new String[] { "avst" }}, + {"Balinese", new String[] { "bali" }}, + {"Bamum", new String[] { "bamu" }}, + {"Bassa_Vah", new String[] { "bass" }}, + {"Batak", new String[] { "batk" }}, + {"Bengali", new String[] { "bng2", "beng" }}, + {"Bhaiksuki", new String[] { "bhks" }}, + {"Bopomofo", new String[] { "bopo" }}, + {"Brahmi", new String[] { "brah" }}, + {"Braille", new String[] { "brai" }}, + {"Buginese", new String[] { "bugi" }}, + {"Buhid", new String[] { "buhd" }}, + // Byzantine Music: byzm + {"Canadian_Aboriginal", new String[] { "cans" }}, + {"Carian", new String[] { "cari" }}, + {"Caucasian_Albanian", new String[] { "aghb" }}, + {"Chakma", new String[] { "cakm" }}, + {"Cham", new String[] { "cham" }}, + {"Cherokee", new String[] { "cher" }}, + {"Common", new String[] { TAG_DEFAULT }}, // "Default" in OpenType + {"Coptic", new String[] { "copt" }}, + {"Cuneiform", new String[] { "xsux" }}, // "Sumero-Akkadian Cuneiform" in OpenType + {"Cypriot", new String[] { "cprt" }}, + {"Cyrillic", new String[] { "cyrl" }}, + {"Deseret", new String[] { "dsrt" }}, + {"Devanagari", new String[] { "dev2", "deva" }}, + {"Duployan", new String[] { "dupl" }}, + {"Egyptian_Hieroglyphs", new String[] { "egyp" }}, + {"Elbasan", new String[] { "elba" }}, + {"Ethiopic", new String[] { "ethi" }}, + {"Georgian", new String[] { "geor" }}, + {"Glagolitic", new String[] { "glag" }}, + {"Gothic", new String[] { "goth" }}, + {"Grantha", new String[] { "gran" }}, + {"Greek", new String[] { "grek" }}, + {"Gujarati", new String[] { "gjr2", "gujr" }}, + {"Gurmukhi", new String[] { "gur2", "guru" }}, + {"Han", new String[] { "hani" }}, // "CJK Ideographic" in OpenType + {"Hangul", new String[] { "hang" }}, + // Hangul Jamo: jamo + {"Hanunoo", new String[] { "hano" }}, + {"Hatran", new String[] { "hatr" }}, + {"Hebrew", new String[] { "hebr" }}, + {"Hiragana", new String[] { "kana" }}, + {"Imperial_Aramaic", new String[] { "armi" }}, + {INHERITED, new String[] { INHERITED }}, + {"Inscriptional_Pahlavi", new String[] { "phli" }}, + {"Inscriptional_Parthian", new String[] { "prti" }}, + {"Javanese", new String[] { "java" }}, + {"Kaithi", new String[] { "kthi" }}, + {"Kannada", new String[] { "knd2", "knda" }}, + {"Katakana", new String[] { "kana" }}, + {"Kayah_Li", new String[] { "kali" }}, + {"Kharoshthi", new String[] { "khar" }}, + {"Khmer", new String[] { "khmr" }}, + {"Khojki", new String[] { "khoj" }}, + {"Khudawadi", new String[] { "sind" }}, + {"Lao", new String[] { "lao " }}, + {"Latin", new String[] { "latn" }}, + {"Lepcha", new String[] { "lepc" }}, + {"Limbu", new String[] { "limb" }}, + {"Linear_A", new String[] { "lina" }}, + {"Linear_B", new String[] { "linb" }}, + {"Lisu", new String[] { "lisu" }}, + {"Lycian", new String[] { "lyci" }}, + {"Lydian", new String[] { "lydi" }}, + {"Mahajani", new String[] { "mahj" }}, + {"Malayalam", new String[] { "mlm2", "mlym" }}, + {"Mandaic", new String[] { "mand" }}, + {"Manichaean", new String[] { "mani" }}, + {"Marchen", new String[] { "marc" }}, + // Mathematical Alphanumeric Symbols: math + {"Meetei_Mayek", new String[] { "mtei" }}, + {"Mende_Kikakui", new String[] { "mend" }}, + {"Meroitic_Cursive", new String[] { "merc" }}, + {"Meroitic_Hieroglyphs", new String[] { "mero" }}, + {"Miao", new String[] { "plrd" }}, + {"Modi", new String[] { "modi" }}, + {"Mongolian", new String[] { "mong" }}, + {"Mro", new String[] { "mroo" }}, + {"Multani", new String[] { "mult" }}, + // Musical Symbols: musc + {"Myanmar", new String[] { "mym2", "mymr" }}, + {"Nabataean", new String[] { "nbat" }}, + {"Newa", new String[] { "newa" }}, + {"New_Tai_Lue", new String[] { "talu" }}, + {"Nko", new String[] { "nko " }}, + {"Ogham", new String[] { "ogam" }}, + {"Ol_Chiki", new String[] { "olck" }}, + {"Old_Italic", new String[] { "ital" }}, + {"Old_Hungarian", new String[] { "hung" }}, + {"Old_North_Arabian", new String[] { "narb" }}, + {"Old_Permic", new String[] { "perm" }}, + {"Old_Persian", new String[] { "xpeo" }}, + {"Old_South_Arabian", new String[] { "sarb" }}, + {"Old_Turkic", new String[] { "orkh" }}, + {"Oriya", new String[] { "ory2", "orya" }}, // "Odia (formerly Oriya)" in OpenType + {"Osage", new String[] { "osge" }}, + {"Osmanya", new String[] { "osma" }}, + {"Pahawh_Hmong", new String[] { "hmng" }}, + {"Palmyrene", new String[] { "palm" }}, + {"Pau_Cin_Hau", new String[] { "pauc" }}, + {"Phags_Pa", new String[] { "phag" }}, + {"Phoenician", new String[] { "phnx" }}, + {"Psalter_Pahlavi", new String[] { "phlp" }}, + {"Rejang", new String[] { "rjng" }}, + {"Runic", new String[] { "runr" }}, + {"Samaritan", new String[] { "samr" }}, + {"Saurashtra", new String[] { "saur" }}, + {"Sharada", new String[] { "shrd" }}, + {"Shavian", new String[] { "shaw" }}, + {"Siddham", new String[] { "sidd" }}, + {"SignWriting", new String[] { "sgnw" }}, + {"Sinhala", new String[] { "sinh" }}, + {"Sora_Sompeng", new String[] { "sora" }}, + {"Sundanese", new String[] { "sund" }}, + {"Syloti_Nagri", new String[] { "sylo" }}, + {"Syriac", new String[] { "syrc" }}, + {"Tagalog", new String[] { "tglg" }}, + {"Tagbanwa", new String[] { "tagb" }}, + {"Tai_Le", new String[] { "tale" }}, + {"Tai_Tham", new String[] { "lana" }}, + {"Tai_Viet", new String[] { "tavt" }}, + {"Takri", new String[] { "takr" }}, + {"Tamil", new String[] { "tml2", "taml" }}, + {"Tangut", new String[] { "tang" }}, + {"Telugu", new String[] { "tel2", "telu" }}, + {"Thaana", new String[] { "thaa" }}, + {"Thai", new String[] { "thai" }}, + {"Tibetan", new String[] { "tibt" }}, + {"Tifinagh", new String[] { "tfng" }}, + {"Tirhuta", new String[] { "tirh" }}, + {"Ugaritic", new String[] { "ugar" }}, + {UNKNOWN, new String[] { TAG_DEFAULT }}, + {"Vai", new String[] { "vai " }}, + {"Warang_Citi", new String[] { "wara" }}, + {"Yi", new String[] { "yi " }} + }; UNICODE_SCRIPT_TO_OPENTYPE_TAG_MAP = new HashMap(table.length); for (Object[] array : table) { @@ -234,7 +234,7 @@ public final class OpenTypeScript catch (IOException e) { Log.w("PdfBox-Android", "Could not parse Scripts.txt, mirroring char map will be empty: " - + e.getMessage()); + + e.getMessage()); } finally { @@ -266,7 +266,7 @@ public int compare(int[] o1, int[] o2) return o1[0] < o2[0] ? -1 : o1[0] == o2[0] ? 0 : 1; }; }); - LineNumberReader rd = new LineNumberReader(new InputStreamReader(inputStream)); + LineNumberReader rd = new LineNumberReader(new InputStreamReader(inputStream, "US-ASCII")); int[] lastRange = { Integer.MIN_VALUE, Integer.MIN_VALUE }; String lastScript = null; do diff --git a/library/src/main/java/com/tom_roush/fontbox/ttf/PostScriptTable.java b/library/src/main/java/com/tom_roush/fontbox/ttf/PostScriptTable.java index 5c7310de7..47c516337 100644 --- a/library/src/main/java/com/tom_roush/fontbox/ttf/PostScriptTable.java +++ b/library/src/main/java/com/tom_roush/fontbox/ttf/PostScriptTable.java @@ -19,7 +19,6 @@ import android.util.Log; import java.io.IOException; - /** * A table in a true type font. * @@ -68,7 +67,11 @@ void read(TrueTypeFont ttf, TTFDataStream data) throws IOException mimMemType1 = data.readUnsignedInt(); maxMemType1 = data.readUnsignedInt(); - if (formatType == 1.0f) + if (data.getCurrentPosition() == data.getOriginalDataSize()) + { + Log.w("PdfBox-Android", "No PostScript name data is provided for the font " + ttf.getName()); + } + else if (formatType == 1.0f) { /* * This TrueType font file contains exactly the 258 glyphs in the standard Macintosh TrueType. @@ -108,7 +111,7 @@ else if (formatType == 2.0f) { // PDFBOX-4851: EOF Log.w("PdfBox-Android", "Error reading names in PostScript table at entry " + i + " of " + - nameArray.length + ", setting remaining entries to .notdef", ex); + nameArray.length + ", setting remaining entries to .notdef", ex); for (int j = i; j < nameArray.length; ++j) { nameArray[j] = ".notdef"; @@ -159,7 +162,7 @@ else if (formatType == 2.5f) else { Log.d("PdfBox-Android", "incorrect glyph name index " + index + - ", valid numbers 0.." + WGL4Names.NUMBER_OF_MAC_GLYPHS); + ", valid numbers 0.." + WGL4Names.NUMBER_OF_MAC_GLYPHS); } } } diff --git a/library/src/main/java/com/tom_roush/fontbox/ttf/TTFDataStream.java b/library/src/main/java/com/tom_roush/fontbox/ttf/TTFDataStream.java index e50ad9055..a73ff4f9f 100644 --- a/library/src/main/java/com/tom_roush/fontbox/ttf/TTFDataStream.java +++ b/library/src/main/java/com/tom_roush/fontbox/ttf/TTFDataStream.java @@ -25,7 +25,6 @@ import java.util.TimeZone; import com.tom_roush.fontbox.util.Charsets; - /** * An interface into a data stream. * @@ -33,6 +32,8 @@ */ abstract class TTFDataStream implements Closeable { + private static final TimeZone TIMEZONE_UTC = TimeZone.getTimeZone("UTC"); // clone before using + TTFDataStream() { } @@ -118,9 +119,10 @@ public int readSignedByte() throws IOException } /** - * Read a unsigned byte. Similar to {@link #read()}, but throws an exception if EOF is unexpectedly reached. + * Read an unsigned byte. Similar to {@link #read()}, but throws an exception if EOF is + * unexpectedly reached. * - * @return A unsigned byte. + * @return An unsigned byte. * @throws IOException If there is an error reading the data. */ public int readUnsignedByte() throws IOException @@ -147,7 +149,8 @@ public long readUnsignedInt() throws IOException long byte4 = read(); if (byte4 < 0) { - throw new EOFException(); + throw new EOFException("EOF at " + getCurrentPosition() + + ", b1: " + byte1 + ", b2: " + byte2 + ", b3: " + byte3 + ", b4: " + byte4); } return (byte1 << 24) + (byte2 << 16) + (byte3 << 8) + byte4; } @@ -195,9 +198,9 @@ public int[] readUnsignedShortArray(int length) throws IOException } /** - * Read an signed short. + * Read a signed short. * - * @return An signed short. + * @return A signed short. * @throws IOException If there is an error reading the data. */ public abstract short readSignedShort() throws IOException; @@ -205,13 +208,13 @@ public int[] readUnsignedShortArray(int length) throws IOException /** * Read an eight byte international date. * - * @return An signed short. + * @return A signed short. * @throws IOException If there is an error reading the data. */ public Calendar readInternationalDate() throws IOException { long secondsSince1904 = readLong(); - Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); + Calendar cal = Calendar.getInstance((TimeZone) TIMEZONE_UTC.clone()); cal.set(1904, 0, 1, 0, 0, 0); cal.set(Calendar.MILLISECOND, 0); long millisFor1904 = cal.getTimeInMillis(); @@ -251,7 +254,7 @@ public byte[] read(int numberOfBytes) throws IOException int totalAmountRead = 0; // read at most numberOfBytes bytes from the stream. while (totalAmountRead < numberOfBytes - && (amountRead = read(data, totalAmountRead, numberOfBytes - totalAmountRead)) != -1) + && (amountRead = read(data, totalAmountRead, numberOfBytes - totalAmountRead)) != -1) { totalAmountRead += amountRead; } diff --git a/library/src/main/java/com/tom_roush/fontbox/ttf/TTFParser.java b/library/src/main/java/com/tom_roush/fontbox/ttf/TTFParser.java index 0a0ad4597..b5885a1a5 100644 --- a/library/src/main/java/com/tom_roush/fontbox/ttf/TTFParser.java +++ b/library/src/main/java/com/tom_roush/fontbox/ttf/TTFParser.java @@ -21,7 +21,6 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; - /** * TrueType font file parser. * @@ -29,6 +28,7 @@ */ public class TTFParser { + private boolean isEmbedded = false; private boolean parseOnDemandOnly = false; @@ -147,9 +147,9 @@ TrueTypeFont parse(TTFDataStream raf) throws IOException { // PDFBOX-5285 if we're lucky, this is an "unimportant" table, e.g. vmtx Log.w("PdfBox-Android", "Skip table '" + table.getTag() + - "' which goes past the file size; offset: " + table.getOffset() + - ", size: " + table.getLength() + - ", font size: " + font.getOriginalDataSize()); + "' which goes past the file size; offset: " + table.getOffset() + + ", size: " + table.getLength() + + ", font size: " + font.getOriginalDataSize()); } else { @@ -188,7 +188,8 @@ private void parseTables(TrueTypeFont font) throws IOException } boolean hasCFF = font.tables.containsKey(CFFTable.TAG); - boolean isPostScript = allowCFF() && hasCFF; + boolean isOTF = font instanceof OpenTypeFont; + boolean isPostScript = isOTF ? ((OpenTypeFont) font).isPostScript() : hasCFF; HeaderTable head = font.getHeader(); if (head == null) @@ -217,22 +218,19 @@ private void parseTables(TrueTypeFont font) throws IOException if (!isPostScript) { - String messageSuffix = ""; - if (hasCFF) - { - messageSuffix = "; this an OpenType CFF font, but we expected a TrueType font here"; - } - IndexToLocationTable loc = font.getIndexToLocation(); - if (loc == null) + if (font.getIndexToLocation() == null) { - throw new IOException("'loca' table is mandatory" + messageSuffix); + throw new IOException("'loca' table is mandatory"); } - if (font.getGlyph() == null) { - throw new IOException("'glyf' table is mandatory" + messageSuffix); + throw new IOException("'glyf' table is mandatory"); } } + else if (!isOTF) + { + throw new IOException("True Type fonts using CFF outlines are not supported"); + } if (font.getNaming() == null && !isEmbedded) { diff --git a/library/src/main/java/com/tom_roush/fontbox/ttf/TTFSubsetter.java b/library/src/main/java/com/tom_roush/fontbox/ttf/TTFSubsetter.java index ffc07686e..f485b521c 100644 --- a/library/src/main/java/com/tom_roush/fontbox/ttf/TTFSubsetter.java +++ b/library/src/main/java/com/tom_roush/fontbox/ttf/TTFSubsetter.java @@ -27,18 +27,18 @@ import java.nio.charset.Charset; import java.util.Calendar; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; -import java.util.Map; import java.util.Map.Entry; +import java.util.Map; import java.util.Set; import java.util.SortedMap; import java.util.SortedSet; import java.util.TimeZone; import java.util.TreeMap; import java.util.TreeSet; - /** * Subsetter for TrueType (TTF) fonts. * @@ -49,7 +49,10 @@ */ public final class TTFSubsetter { - private static final byte[] PAD_BUF = new byte[] { 0, 0, 0 }; + + private static final byte[] PAD_BUF = new byte[] { 0, 0, 0, 0 }; + + private static final TimeZone TIMEZONE_UTC = TimeZone.getTimeZone("UTC"); // clone before using private final TrueTypeFont ttf; private final CmapLookup unicodeCmap; @@ -57,6 +60,7 @@ public final class TTFSubsetter private final List keepTables; private final SortedSet glyphIds; // new glyph ids + private final Set invisibleGlyphIds; private String prefix; private boolean hasAddedCompoundReferences; @@ -83,6 +87,7 @@ public TTFSubsetter(TrueTypeFont ttf, List tables) throws IOException uniToGID = new TreeMap(); glyphIds = new TreeSet(); + invisibleGlyphIds = new HashSet(); // find the best Unicode cmap this.unicodeCmap = ttf.getUnicodeCmapLookup(); @@ -127,6 +132,23 @@ public void addAll(Set unicodeSet) } } + /** + * Forces the glyph for the specified character code to be zero-width and contour-free, + * regardless of what the glyph looks like in the original font. Note that the specified + * character code is not added to the subset unless it is also {@link #add(int) added} + * separately. + * + * @param unicode the character code whose glyph should be invisible + */ + public void forceInvisible(int unicode) + { + int gid = unicodeCmap.getGlyphId(unicode); + if (gid != 0) + { + invisibleGlyphIds.add(gid); + } + } + /** * Returns the map of new -> old GIDs. */ @@ -171,7 +193,7 @@ private long writeFileHeader(DataOutputStream out, int nTables) throws IOExcepti } private long writeTableHeader(DataOutputStream out, String tag, long offset, byte[] bytes) - throws IOException + throws IOException { long checksum = 0; for (int nup = 0, n = bytes.length; nup < n; nup++) @@ -203,7 +225,7 @@ private void writeTableBody(OutputStream os, byte[] bytes) throws IOException private byte[] buildHeadTable() throws IOException { - ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ByteArrayOutputStream bos = new ByteArrayOutputStream(54); DataOutputStream out = new DataOutputStream(bos); HeaderTable h = ttf.getHeader(); @@ -232,7 +254,7 @@ private byte[] buildHeadTable() throws IOException private byte[] buildHheaTable() throws IOException { - ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ByteArrayOutputStream bos = new ByteArrayOutputStream(36); DataOutputStream out = new DataOutputStream(bos); HorizontalHeaderTable h = ttf.getHorizontalHeader(); @@ -269,14 +291,14 @@ private byte[] buildHheaTable() throws IOException private boolean shouldCopyNameRecord(NameRecord nr) { return nr.getPlatformId() == NameRecord.PLATFORM_WINDOWS - && nr.getPlatformEncodingId() == NameRecord.ENCODING_WINDOWS_UNICODE_BMP - && nr.getLanguageId() == NameRecord.LANGUAGE_WINDOWS_EN_US - && nr.getNameId() >= 0 && nr.getNameId() < 7; + && nr.getPlatformEncodingId() == NameRecord.ENCODING_WINDOWS_UNICODE_BMP + && nr.getLanguageId() == NameRecord.LANGUAGE_WINDOWS_EN_US + && nr.getNameId() >= 0 && nr.getNameId() < 7; } private byte[] buildNameTable() throws IOException { - ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ByteArrayOutputStream bos = new ByteArrayOutputStream(512); DataOutputStream out = new DataOutputStream(bos); NamingTable name = ttf.getNaming(); @@ -372,26 +394,28 @@ else if (encoding == 2) // ISO 8859-1 private byte[] buildMaxpTable() throws IOException { - ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ByteArrayOutputStream bos = new ByteArrayOutputStream(32); DataOutputStream out = new DataOutputStream(bos); MaximumProfileTable p = ttf.getMaximumProfile(); writeFixed(out, 1.0); writeUint16(out, glyphIds.size()); - writeUint16(out, p.getMaxPoints()); - writeUint16(out, p.getMaxContours()); - writeUint16(out, p.getMaxCompositePoints()); - writeUint16(out, p.getMaxCompositeContours()); - writeUint16(out, p.getMaxZones()); - writeUint16(out, p.getMaxTwilightPoints()); - writeUint16(out, p.getMaxStorage()); - writeUint16(out, p.getMaxFunctionDefs()); - writeUint16(out, p.getMaxInstructionDefs()); - writeUint16(out, p.getMaxStackElements()); - writeUint16(out, p.getMaxSizeOfInstructions()); - writeUint16(out, p.getMaxComponentElements()); - writeUint16(out, p.getMaxComponentDepth()); - + if (p.getVersion() >= 1.0f) + { + writeUint16(out, p.getMaxPoints()); + writeUint16(out, p.getMaxContours()); + writeUint16(out, p.getMaxCompositePoints()); + writeUint16(out, p.getMaxCompositeContours()); + writeUint16(out, p.getMaxZones()); + writeUint16(out, p.getMaxTwilightPoints()); + writeUint16(out, p.getMaxStorage()); + writeUint16(out, p.getMaxFunctionDefs()); + writeUint16(out, p.getMaxInstructionDefs()); + writeUint16(out, p.getMaxStackElements()); + writeUint16(out, p.getMaxSizeOfInstructions()); + writeUint16(out, p.getMaxComponentElements()); + writeUint16(out, p.getMaxComponentDepth()); + } out.flush(); return bos.toByteArray(); } @@ -404,7 +428,7 @@ private byte[] buildOS2Table() throws IOException return null; } - ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ByteArrayOutputStream bos = new ByteArrayOutputStream(78); DataOutputStream out = new DataOutputStream(bos); writeUint16(out, os2.getVersion()); @@ -452,7 +476,7 @@ private byte[] buildOS2Table() throws IOException // never returns null private byte[] buildLocaTable(long[] newOffsets) throws IOException { - ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ByteArrayOutputStream bos = new ByteArrayOutputStream(newOffsets.length * 4); DataOutputStream out = new DataOutputStream(bos); for (long offset : newOffsets) @@ -486,12 +510,12 @@ private void addCompoundReferences() throws IOException { is.skip(g.getOffset()); long lastOff = 0L; - for (Integer glyphId : glyphIds) + for (Integer gid : glyphIds) { - long offset = offsets[glyphId]; - long len = offsets[glyphId + 1] - offset; + long offset = offsets[gid]; + long length = offsets[gid + 1] - offset; is.skip(offset - lastOff); - byte[] buf = new byte[(int)len]; + byte[] buf = new byte[(int) length]; is.read(buf); // rewrite glyphIds for compound glyphs if (buf.length >= 2 && buf[0] == -1 && buf[1] == -1) @@ -540,18 +564,18 @@ else if ((flags & 1 << 3) != 0) while ((flags & 1 << 5) != 0); // MORE_COMPONENTS } - lastOff = offsets[glyphId + 1]; + lastOff = offsets[gid + 1]; } } finally { is.close(); } - if (glyphIdsToAdd != null) + hasNested = glyphIdsToAdd != null; + if (hasNested) { glyphIds.addAll(glyphIdsToAdd); } - hasNested = glyphIdsToAdd != null; } while (hasNested); } @@ -559,7 +583,7 @@ else if ((flags & 1 << 3) != 0) // never returns null private byte[] buildGlyfTable(long[] newOffsets) throws IOException { - ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ByteArrayOutputStream bos = new ByteArrayOutputStream(512); GlyphTable g = ttf.getGlyph(); long[] offsets = ttf.getIndexToLocation().getOffsets(); @@ -568,7 +592,7 @@ private byte[] buildGlyfTable(long[] newOffsets) throws IOException { is.skip(g.getOffset()); - long prevEnd = 0; // previously read glyph offset + long lastOff = 0; // previously read glyph offset long newOffset = 0; // new offset for the glyph in the subset font int newGid = 0; // new GID in subset font @@ -579,7 +603,15 @@ private byte[] buildGlyfTable(long[] newOffsets) throws IOException long length = offsets[gid + 1] - offset; newOffsets[newGid++] = newOffset; - is.skip(offset - prevEnd); + is.skip(offset - lastOff); + + // glyphs with no outlines have an empty entry in the 'glyf' table, with a + // corresponding 'loca' table entry with length = 0 + if (invisibleGlyphIds.contains(gid)) + { + lastOff = offset; + continue; + } byte[] buf = new byte[(int)length]; is.read(buf); @@ -598,8 +630,11 @@ private byte[] buildGlyfTable(long[] newOffsets) throws IOException // glyphIndex int componentGid = (buf[off] & 0xff) << 8 | buf[off + 1] & 0xff; - glyphIds.add(componentGid); - + if (!glyphIds.contains(componentGid)) + { + // PDFBOX-6085 + throw new IOException("Internal error: componentGid " + componentGid + " not in glyphIds set"); + } int newComponentGid = getNewGlyphId(componentGid); buf[off] = (byte)(newComponentGid >>> 8); buf[off + 1] = (byte)newComponentGid; @@ -666,7 +701,7 @@ else if (buf.length > 0) newOffset += len; } - prevEnd = offset + length; + lastOff = offset + length; } newOffsets[newGid++] = newOffset; } @@ -690,7 +725,7 @@ private byte[] buildCmapTable() throws IOException return null; } - ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ByteArrayOutputStream bos = new ByteArrayOutputStream(64); DataOutputStream out = new DataOutputStream(bos); // cmap header @@ -804,12 +839,13 @@ else if (!lastChar.getKey().equals(prevChar.getKey())) private byte[] buildPostTable() throws IOException { PostScriptTable post = ttf.getPostScript(); - if (post == null || keepTables != null && !keepTables.contains("post")) + if (post == null || post.getGlyphNames() == null || + keepTables != null && !keepTables.contains("post")) { return null; } - ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ByteArrayOutputStream bos = new ByteArrayOutputStream(64); DataOutputStream out = new DataOutputStream(bos); writeFixed(out, 2.0); // version @@ -880,15 +916,24 @@ private byte[] buildHmtxTable() throws IOException { is.skip(hm.getOffset()); long lastOffset = 0; - for (Integer glyphId : glyphIds) + for (Integer gid : glyphIds) { // offset in original file long offset; - if (glyphId <= lastgid) + if (gid <= lastgid) { - // copy width and lsb - offset = glyphId * 4l; - lastOffset = copyBytes(is, bos, offset, lastOffset, 4); + if (invisibleGlyphIds.contains(gid)) + { + // force zero width (no change to last offset) + // 4 bytes total, 2 bytes each for: advance width = 0, left side bearing = 0 + bos.write(PAD_BUF, 0, 4); + } + else + { + // copy width and lsb + offset = gid * 4l; + lastOffset = copyBytes(is, bos, offset, lastOffset, 4); + } } else { @@ -904,7 +949,7 @@ private byte[] buildHmtxTable() throws IOException } // copy lsb only, as we are beyond numOfHMetrics - offset = h.getNumberOfHMetrics() * 4l + (glyphId - h.getNumberOfHMetrics()) * 2l; + offset = h.getNumberOfHMetrics() * 4l + (gid - h.getNumberOfHMetrics()) * 2l; lastOffset = copyBytes(is, bos, offset, lastOffset, 2); } } @@ -918,7 +963,7 @@ private byte[] buildHmtxTable() throws IOException } private long copyBytes(InputStream is, OutputStream os, long newOffset, long lastOffset, int count) - throws IOException + throws IOException { // skip over from last original offset long nskip = newOffset - lastOffset; @@ -1011,7 +1056,7 @@ public void writeToStream(OutputStream os) throws IOException for (Map.Entry entry : tables.entrySet()) { checksum += writeTableHeader(out, entry.getKey(), offset, entry.getValue()); - offset += (entry.getValue().length + 3) / 4 * 4; + offset += (entry.getValue().length + 3L) / 4 * 4; } checksum = 0xB1B0AFBAL - (checksum & 0xffffffffL); @@ -1062,7 +1107,7 @@ private void writeUint8(DataOutputStream out, int i) throws IOException private void writeLongDateTime(DataOutputStream out, Calendar calendar) throws IOException { // inverse operation of TTFDataStream.readInternationalDate() - Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); + Calendar cal = Calendar.getInstance((TimeZone) TIMEZONE_UTC.clone()); cal.set(1904, 0, 1, 0, 0, 0); cal.set(Calendar.MILLISECOND, 0); long millisFor1904 = cal.getTimeInMillis(); @@ -1078,9 +1123,9 @@ private long toUInt32(int high, int low) private long toUInt32(byte[] bytes) { return (bytes[0] & 0xffL) << 24 - | (bytes[1] & 0xffL) << 16 - | (bytes[2] & 0xffL) << 8 - | bytes[3] & 0xffL; + | (bytes[1] & 0xffL) << 16 + | (bytes[2] & 0xffL) << 8 + | bytes[3] & 0xffL; } private int log2(int num) diff --git a/library/src/main/java/com/tom_roush/fontbox/ttf/TrueTypeCollection.java b/library/src/main/java/com/tom_roush/fontbox/ttf/TrueTypeCollection.java index 9e5851512..5ee1f638f 100644 --- a/library/src/main/java/com/tom_roush/fontbox/ttf/TrueTypeCollection.java +++ b/library/src/main/java/com/tom_roush/fontbox/ttf/TrueTypeCollection.java @@ -21,7 +21,6 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; - /** * A TrueType Collection, now more properly known as a "Font Collection" as it may contain either * TrueType or OpenType fonts. @@ -57,9 +56,9 @@ public TrueTypeCollection(InputStream stream) throws IOException } /** - * Creates a new TrueTypeCollection from a TTC stream. + * Creates a new TrueTypeCollection from a TTFDataStream. * - * @param stream The TTF file. + * @param stream A data stream to read. * @throws IOException If the font could not be parsed. */ TrueTypeCollection(TTFDataStream stream) throws IOException diff --git a/library/src/main/java/com/tom_roush/fontbox/ttf/TrueTypeFont.java b/library/src/main/java/com/tom_roush/fontbox/ttf/TrueTypeFont.java index bb7ef5091..90845c8a5 100644 --- a/library/src/main/java/com/tom_roush/fontbox/ttf/TrueTypeFont.java +++ b/library/src/main/java/com/tom_roush/fontbox/ttf/TrueTypeFont.java @@ -31,7 +31,6 @@ import com.tom_roush.fontbox.FontBoxFont; import com.tom_roush.fontbox.util.BoundingBox; - /** * A TrueType font file. * @@ -67,7 +66,7 @@ public void close() throws IOException protected void finalize() throws Throwable { super.finalize(); - // PDFBOX-4963: risk of memory leaks due to SoftReference in FontCache + // PDFBOX-4963: risk of memory leaks due to SoftReference in FontCache close(); } @@ -321,7 +320,7 @@ public GlyphSubstitutionTable getGsub() throws IOException /** * Get the data of the TrueType Font - * program representing the stream used to build this + * program representing the stream used to build this * object (normally from the TTFParser object). * * @return COSStream TrueType font program stream @@ -330,7 +329,7 @@ public GlyphSubstitutionTable getGsub() throws IOException */ public InputStream getOriginalData() throws IOException { - return data.getOriginalData(); + return data.getOriginalData(); } /** @@ -341,7 +340,7 @@ public InputStream getOriginalData() throws IOException */ public long getOriginalDataSize() { - return data.getOriginalDataSize(); + return data.getOriginalDataSize(); } /** @@ -548,7 +547,7 @@ public CmapLookup getUnicodeCmapLookup(boolean isStrict) throws IOException if (table != null) { return new SubstitutingCmapLookup(cmap, (GlyphSubstitutionTable) table, - Collections.unmodifiableList(enabledGsubFeatures)); + Collections.unmodifiableList(enabledGsubFeatures)); } } return cmap; @@ -570,28 +569,34 @@ private CmapSubtable getUnicodeCmapImpl(boolean isStrict) throws IOException } CmapSubtable cmap = cmapTable.getSubtable(CmapTable.PLATFORM_UNICODE, - CmapTable.ENCODING_UNICODE_2_0_FULL); + CmapTable.ENCODING_UNICODE_2_0_FULL); if (cmap == null) { cmap = cmapTable.getSubtable(CmapTable.PLATFORM_WINDOWS, - CmapTable.ENCODING_WIN_UNICODE_FULL); + CmapTable.ENCODING_WIN_UNICODE_FULL); } if (cmap == null) { cmap = cmapTable.getSubtable(CmapTable.PLATFORM_UNICODE, - CmapTable.ENCODING_UNICODE_2_0_BMP); + CmapTable.ENCODING_UNICODE_2_0_BMP); } if (cmap == null) { cmap = cmapTable.getSubtable(CmapTable.PLATFORM_WINDOWS, - CmapTable.ENCODING_WIN_UNICODE_BMP); + CmapTable.ENCODING_WIN_UNICODE_BMP); } if (cmap == null) { // Microsoft's "Recommendations for OpenType Fonts" says that "Symbol" encoding // actually means "Unicode, non-standard character set" cmap = cmapTable.getSubtable(CmapTable.PLATFORM_WINDOWS, - CmapTable.ENCODING_WIN_SYMBOL); + CmapTable.ENCODING_WIN_SYMBOL); + } + if (cmap == null) + { + // PDFBOX-6015 + cmap = cmapTable.getSubtable(CmapTable.PLATFORM_UNICODE, + CmapTable.ENCODING_UNICODE_1_1); } if (cmap == null) { @@ -633,6 +638,12 @@ public int nameToGID(String name) throws IOException return cmap.getGlyphId(uni); } + // PDFBOX-5604: assume gnnnnn is a gid + if (name.matches("g\\d+")) + { + return Integer.parseInt(name.substring(1)); + } + return 0; } diff --git a/library/src/main/java/com/tom_roush/fontbox/ttf/VerticalOriginTable.java b/library/src/main/java/com/tom_roush/fontbox/ttf/VerticalOriginTable.java index f3d115838..48a18a7ac 100644 --- a/library/src/main/java/com/tom_roush/fontbox/ttf/VerticalOriginTable.java +++ b/library/src/main/java/com/tom_roush/fontbox/ttf/VerticalOriginTable.java @@ -19,7 +19,6 @@ import java.io.IOException; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; - /** * A vertical origin 'VORG' table in an OpenType font. * @@ -91,13 +90,7 @@ public float getVersion() */ public int getOriginY(int gid) { - if (origins.containsKey(gid)) - { - return origins.get(gid); - } - else - { - return defaultVertOriginY; - } + Integer originY = origins.get(gid); + return originY != null ? originY : defaultVertOriginY; } } diff --git a/library/src/main/java/com/tom_roush/fontbox/type1/Type1Font.java b/library/src/main/java/com/tom_roush/fontbox/type1/Type1Font.java index d1a5505a2..14b24a407 100644 --- a/library/src/main/java/com/tom_roush/fontbox/type1/Type1Font.java +++ b/library/src/main/java/com/tom_roush/fontbox/type1/Type1Font.java @@ -35,7 +35,6 @@ import com.tom_roush.fontbox.encoding.Encoding; import com.tom_roush.fontbox.pfb.PfbParser; import com.tom_roush.fontbox.util.BoundingBox; - /** * Represents an Adobe Type 1 (.pfb) font. Thread safe. * @@ -92,8 +91,8 @@ public static Type1Font createWithSegments(byte[] segment1, byte[] segment2) thr Encoding encoding = null; int paintType; int fontType; - List fontMatrix = new ArrayList(); - List fontBBox = new ArrayList(); + List fontMatrix = Collections.emptyList(); + List fontBBox = Collections.emptyList(); int uniqueID; float strokeWidth; String fontID = ""; @@ -110,17 +109,17 @@ public static Type1Font createWithSegments(byte[] segment1, byte[] segment2) thr float underlineThickness; // Private dictionary - List blueValues = new ArrayList(); - List otherBlues = new ArrayList(); - List familyBlues = new ArrayList(); - List familyOtherBlues = new ArrayList(); + List blueValues = Collections.emptyList(); + List otherBlues = Collections.emptyList(); + List familyBlues = Collections.emptyList(); + List familyOtherBlues = Collections.emptyList(); float blueScale; int blueShift; int blueFuzz; - List stdHW = new ArrayList(); - List stdVW = new ArrayList(); - List stemSnapH = new ArrayList(); - List stemSnapV = new ArrayList(); + List stdHW = Collections.emptyList(); + List stdVW = Collections.emptyList(); + List stemSnapH = Collections.emptyList(); + List stemSnapV = Collections.emptyList(); boolean forceBold; int languageGroup; @@ -130,7 +129,7 @@ public static Type1Font createWithSegments(byte[] segment1, byte[] segment2) thr // private caches private final Map charStringCache = - new ConcurrentHashMap(); + new ConcurrentHashMap(); // raw data private final byte[] segment1; @@ -199,6 +198,10 @@ public Type1CharString getType1CharString(String name) throws IOException if (bytes == null) { bytes = charstrings.get(".notdef"); + if (bytes == null) + { + throw new IOException(".notdef is not defined"); + } } Type1CharStringParser parser = new Type1CharStringParser(fontName, name); List sequence = parser.parse(bytes, subrs); @@ -255,6 +258,7 @@ public int getFontType() * * @return the font matrix */ + @Override public List getFontMatrix() { return Collections.unmodifiableList(fontMatrix); @@ -552,7 +556,7 @@ public byte[] getBinarySegment() public String toString() { return getClass().getName() + "[fontName=" + fontName + ", fullName=" + fullName - + ", encoding=" + encoding + ", charStringsDict=" + charstrings - + "]"; + + ", encoding=" + encoding + ", charStringsDict=" + charstrings + + "]"; } } diff --git a/library/src/main/java/com/tom_roush/fontbox/type1/Type1Lexer.java b/library/src/main/java/com/tom_roush/fontbox/type1/Type1Lexer.java index 73eb8abb1..a9f8bd96e 100644 --- a/library/src/main/java/com/tom_roush/fontbox/type1/Type1Lexer.java +++ b/library/src/main/java/com/tom_roush/fontbox/type1/Type1Lexer.java @@ -24,7 +24,6 @@ import java.io.IOException; import java.nio.BufferUnderflowException; import java.nio.ByteBuffer; - /** * Lexer for the ASCII portions of an Adobe Type 1 font. * @@ -98,7 +97,7 @@ private char getChar() throws IOException { try { - return (char) buffer.get(); + return (char) buffer.get(); } catch (BufferUnderflowException exception) { @@ -158,7 +157,7 @@ else if (c == '/') { // the stream is corrupt throw new DamagedFontException("Could not read token at position " + - buffer.position()); + buffer.position()); } return new Token(regular, Token.LITERAL); } @@ -217,7 +216,7 @@ else if (c == 0) { // the stream is corrupt throw new DamagedFontException("Could not read token at position " + - buffer.position()); + buffer.position()); } if (name.equals("RD") || name.equals("-|")) @@ -361,7 +360,7 @@ else if (c != 'e' && c != 'E') } catch (NumberFormatException ex) { - throw new IOException("Invalid number '" + sb.toString() + "'", ex); + throw new IOException("Invalid number '" + sb + "'", ex); } return new Token(Integer.toString(val), Token.INTEGER); } @@ -497,12 +496,16 @@ private Token readString() throws IOException */ private Token readCharString(int length) throws IOException { + if (length > buffer.array().length) + { + throw new IOException("String length " + length + " is larger than input"); + } try { - buffer.get(); // space - byte[] data = new byte[length]; - buffer.get(data); - return new Token(data, Token.CHARSTRING); + buffer.get(); // space + byte[] data = new byte[length]; + buffer.get(data); + return new Token(data, Token.CHARSTRING); } catch (BufferUnderflowException exception) { diff --git a/library/src/main/java/com/tom_roush/fontbox/type1/Type1Parser.java b/library/src/main/java/com/tom_roush/fontbox/type1/Type1Parser.java index 317bb013f..798ef2097 100644 --- a/library/src/main/java/com/tom_roush/fontbox/type1/Type1Parser.java +++ b/library/src/main/java/com/tom_roush/fontbox/type1/Type1Parser.java @@ -25,7 +25,6 @@ import com.tom_roush.fontbox.encoding.BuiltInEncoding; import com.tom_roush.fontbox.encoding.StandardEncoding; - /** * Parses an Adobe Type 1 (.pfb) font. It is used exclusively by Type1Font. * @@ -218,16 +217,19 @@ private void readEncoding() throws IOException // we have to check "readonly" and "def" too // as some fonts don't provide any dup-values, see PDFBOX-2134 while (!(lexer.peekKind(Token.NAME) && - (lexer.peekToken().getText().equals("dup") || + (lexer.peekToken().getText().equals("dup") || lexer.peekToken().getText().equals("readonly") || lexer.peekToken().getText().equals("def")))) { - lexer.nextToken(); + if ( lexer.nextToken() == null ) + { + throw new IOException( "Incomplete data while reading encoding of type 1 font" ); + } } Map codeToName = new HashMap(); while (lexer.peekKind(Token.NAME) && - lexer.peekToken().getText().equals("dup")) + lexer.peekToken().getText().equals("dup")) { read(Token.NAME, "dup"); int code = read(Token.INTEGER).intValue(); @@ -246,7 +248,7 @@ private void readEncoding() throws IOException */ private List arrayToNumbers(List value) throws IOException { - List numbers = new ArrayList(); + List numbers = new ArrayList(value.size()); for (int i = 1, size = value.size() - 1; i < size; i++) { Token token = value.get(i); @@ -261,7 +263,7 @@ else if (token.getKind() == Token.INTEGER) else { throw new IOException("Expected INTEGER or REAL but got " + token + - " at array position " + i); + " at array position " + i); } } return numbers; @@ -327,6 +329,13 @@ private Map> readSimpleDict() throws IOException int length = read(Token.INTEGER).intValue(); read(Token.NAME, "dict"); readMaybe(Token.NAME, "dup"); + + if (readMaybe(Token.NAME, "def") != null) + { + // PDFBOX-5942 empty dict + return dict; + } + read(Token.NAME, "begin"); for (int i = 0; i < length; i++) @@ -336,7 +345,7 @@ private Map> readSimpleDict() throws IOException break; } if (lexer.peekKind(Token.NAME) && - !lexer.peekToken().getText().equals("end")) + !lexer.peekToken().getText().equals("end")) { read(Token.NAME); } @@ -642,9 +651,12 @@ else if ("RD".equals(key)) // sometimes followed by "put". Either way, we just skip until // the /CharStrings dict is found while (!(lexer.peekKind(Token.LITERAL) - && lexer.peekToken().getText().equals("CharStrings"))) + && lexer.peekToken().getText().equals("CharStrings"))) { - lexer.nextToken(); + if ( lexer.nextToken() == null ) + { + throw new IOException( "Missing 'CharStrings' dictionary in type 1 font" ); + } } // CharStrings dict @@ -733,7 +745,7 @@ private void readSubrs(int lenIV) throws IOException break; } if (!(lexer.peekKind(Token.NAME) && - lexer.peekToken().getText().equals("dup"))) + lexer.peekToken().getText().equals("dup"))) { break; } @@ -891,8 +903,6 @@ private Token read(Token.Kind kind) throws IOException /** * Reads the next token and throws an exception if it is not of the given kind * and does not have the given value. - * - * @return token, never null */ private void read(Token.Kind kind, String name) throws IOException { @@ -969,7 +979,7 @@ private boolean isBinary(byte[] bytes) { byte by = bytes[i]; if (by != 0x0a && by != 0x0d && by != 0x20 && by != '\t' && - Character.digit((char) by, 16) == -1) + Character.digit((char) by, 16) == -1) { return true; } diff --git a/library/src/main/java/com/tom_roush/fontbox/util/autodetect/UnixFontDirFinder.java b/library/src/main/java/com/tom_roush/fontbox/util/autodetect/UnixFontDirFinder.java index 5a21f0a62..d29053114 100644 --- a/library/src/main/java/com/tom_roush/fontbox/util/autodetect/UnixFontDirFinder.java +++ b/library/src/main/java/com/tom_roush/fontbox/util/autodetect/UnixFontDirFinder.java @@ -17,6 +17,7 @@ package com.tom_roush.fontbox.util.autodetect; + /** * Unix font directory finder. This class is based on a class provided by Apache FOP. see * com.tom_roush.fop.fonts.autodetect.UnixFontDirFinder @@ -27,15 +28,15 @@ public class UnixFontDirFinder extends NativeFontDirFinder /** * Some guesses at possible unix font directory locations. * - * @return a list of possible font locations + * @return an array of possible font locations */ @Override protected String[] getSearchableDirectories() { return new String[] { System.getProperty("user.home") + "/.fonts", // user - "/usr/local/fonts", // local - "/usr/local/share/fonts", // local shared - "/usr/share/fonts", // system + "/usr/local/fonts", // local + "/usr/local/share/fonts", // local shared + "/usr/share/fonts", // system "/usr/X11R6/lib/X11/fonts" // X }; } diff --git a/library/src/main/java/com/tom_roush/fontbox/util/autodetect/WindowsFontDirFinder.java b/library/src/main/java/com/tom_roush/fontbox/util/autodetect/WindowsFontDirFinder.java index 5dea19516..2e30b3eb5 100644 --- a/library/src/main/java/com/tom_roush/fontbox/util/autodetect/WindowsFontDirFinder.java +++ b/library/src/main/java/com/tom_roush/fontbox/util/autodetect/WindowsFontDirFinder.java @@ -17,44 +17,15 @@ package com.tom_roush.fontbox.util.autodetect; -import java.io.BufferedReader; import java.io.File; -import java.io.IOException; -import java.io.InputStreamReader; import java.util.List; - -import com.tom_roush.fontbox.util.Charsets; - /** * FontFinder for native Windows platforms. This class is based on a class provided by Apache FOP. see - * com.tom_roush.fop.fonts.autodetect.WindowsFontDirFinder + * org.apache.fop.fonts.autodetect.WindowsFontDirFinder */ public class WindowsFontDirFinder implements FontDirFinder { - /** - * Attempts to read windir environment variable on windows (disclaimer: This is a bit dirty but seems to work - * nicely). - */ - private String getWinDir(String osName) throws IOException - { - Process process; - Runtime runtime = Runtime.getRuntime(); - if (osName.startsWith("Windows 9")) - { - process = runtime.exec("command.com /c echo %windir%"); - } - else - { - process = runtime.exec("cmd.exe /c echo %windir%"); - } - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader( - process.getInputStream(), Charsets.ISO_8859_1)); - String winDir = bufferedReader.readLine(); - bufferedReader.close(); - return winDir; - } - /** * {@inheritDoc} * @@ -73,16 +44,11 @@ public List find() { // should continue if this fails } - String osName = System.getProperty("os.name"); if (windir == null) { try { - windir = getWinDir(osName); - } - catch (IOException e) - { - // should continue if this fails + windir = System.getenv("windir"); } catch (SecurityException e) { @@ -111,12 +77,13 @@ public List find() } else { + String osName = System.getProperty("os.name"); String windowsDirName = osName.endsWith("NT") ? "WINNT" : "WINDOWS"; // look for true type font folder for (char driveLetter = 'C'; driveLetter <= 'E'; driveLetter++) { osFontsDir = new File(driveLetter + ":" + File.separator + windowsDirName - + File.separator + "FONTS"); + + File.separator + "FONTS"); try { if (osFontsDir.exists() && osFontsDir.canRead()) @@ -155,7 +122,7 @@ public List find() if (localAppData != null && !localAppData.isEmpty()) { File localFontDir = new File(localAppData + File.separator + "Microsoft" + - File.separator + "Windows" + File.separator + "Fonts"); + File.separator + "Windows" + File.separator + "Fonts"); if (localFontDir.exists() && localFontDir.canRead()) { fontDirList.add(localFontDir); diff --git a/library/src/main/java/com/tom_roush/pdfbox/contentstream/PDFStreamEngine.java b/library/src/main/java/com/tom_roush/pdfbox/contentstream/PDFStreamEngine.java index 553fc5cdf..8ff32f29f 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/contentstream/PDFStreamEngine.java +++ b/library/src/main/java/com/tom_roush/pdfbox/contentstream/PDFStreamEngine.java @@ -30,9 +30,11 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.zip.DataFormatException; import com.tom_roush.pdfbox.contentstream.operator.MissingOperandException; import com.tom_roush.pdfbox.contentstream.operator.Operator; +import com.tom_roush.pdfbox.contentstream.operator.OperatorName; import com.tom_roush.pdfbox.contentstream.operator.OperatorProcessor; import com.tom_roush.pdfbox.contentstream.operator.state.EmptyGraphicsStackException; import com.tom_roush.pdfbox.cos.COSArray; @@ -55,6 +57,7 @@ import com.tom_roush.pdfbox.pdmodel.graphics.blend.BlendMode; import com.tom_roush.pdfbox.pdmodel.graphics.color.PDColor; import com.tom_roush.pdfbox.pdmodel.graphics.color.PDColorSpace; +import com.tom_roush.pdfbox.pdmodel.graphics.color.PDDeviceGray; import com.tom_roush.pdfbox.pdmodel.graphics.form.PDFormXObject; import com.tom_roush.pdfbox.pdmodel.graphics.form.PDTransparencyGroup; import com.tom_roush.pdfbox.pdmodel.graphics.pattern.PDTilingPattern; @@ -64,7 +67,6 @@ import com.tom_roush.pdfbox.pdmodel.interactive.annotation.PDAppearanceStream; import com.tom_roush.pdfbox.util.Matrix; import com.tom_roush.pdfbox.util.Vector; - /** * Processes a PDF content stream and executes certain operations. * Provides a callback interface for clients that want to do things with the stream. @@ -73,10 +75,8 @@ */ public abstract class PDFStreamEngine { - private final Map operators = new HashMap(80); - private Matrix textMatrix; - private Matrix textLineMatrix; + private final Map operators = new HashMap(); private Deque graphicsStack = new ArrayDeque(); @@ -88,6 +88,9 @@ public abstract class PDFStreamEngine // used to monitor potentially recursive operations. private int level = 0; + // false in certain cases, e.g. type3 charprocs with d1 or uncolored tiling patterns + private boolean shouldProcessColorOperators; + /** * Creates a new PDFStreamEngine. */ @@ -132,8 +135,6 @@ private void initPage(PDPage page) currentPage = page; graphicsStack.clear(); graphicsStack.push(new PDGraphicsState(page.getCropBox())); - textMatrix = null; - textLineMatrix = null; resources = null; initialMatrix = page.getMatrix(); } @@ -177,7 +178,7 @@ public void showForm(PDFormXObject form) throws IOException if (currentPage == null) { throw new IllegalStateException("No current page, call " + - "#processChildStream(PDContentStream, PDPage) instead"); + "#processChildStream(PDContentStream, PDPage) instead"); } if (form.getCOSObject().getLength() > 0) { @@ -195,10 +196,23 @@ public void showForm(PDFormXObject form) throws IOException protected void processSoftMask(PDTransparencyGroup group) throws IOException { saveGraphicsState(); - Matrix softMaskCTM = getGraphicsState().getSoftMask().getInitialTransformationMatrix(); - getGraphicsState().setCurrentTransformationMatrix(softMaskCTM); - processTransparencyGroup(group); - restoreGraphicsState(); + PDGraphicsState graphicsState = getGraphicsState(); + Matrix softMaskCTM = graphicsState.getSoftMask().getInitialTransformationMatrix(); + graphicsState.setCurrentTransformationMatrix(softMaskCTM); + graphicsState.setTextMatrix(new Matrix()); + graphicsState.setTextLineMatrix(new Matrix()); + graphicsState.setNonStrokingColorSpace(PDDeviceGray.INSTANCE); + graphicsState.setNonStrokingColor(PDDeviceGray.INSTANCE.getInitialColor()); + graphicsState.setStrokingColorSpace(PDDeviceGray.INSTANCE); + graphicsState.setStrokingColor(PDDeviceGray.INSTANCE.getInitialColor()); + try + { + processTransparencyGroup(group); + } + finally + { + restoreGraphicsState(); + } } /** @@ -213,7 +227,7 @@ protected void processTransparencyGroup(PDTransparencyGroup group) throws IOExce if (currentPage == null) { throw new IllegalStateException("No current page, call " + - "#processChildStream(PDContentStream, PDPage) instead"); + "#processChildStream(PDContentStream, PDPage) instead"); } PDResources parent = pushResources(group); @@ -228,8 +242,8 @@ protected void processTransparencyGroup(PDTransparencyGroup group) throws IOExce // transform the CTM using the stream's matrix graphicsState.getCurrentTransformationMatrix().concatenate(group.getMatrix()); - // Before execution of the transparency group XObject’s content stream, - // the current blend mode in the graphics state shall be initialized to Normal, + // Before execution of the transparency group XObject’s content stream, + // the current blend mode in the graphics state shall be initialized to Normal, // the current stroking and nonstroking alpha constants to 1.0, and the current soft mask to None. graphicsState.setBlendMode(BlendMode.NORMAL); graphicsState.setAlphaConstant(1); @@ -260,30 +274,28 @@ protected void processTransparencyGroup(PDTransparencyGroup group) throws IOExce * @throws IOException if there is an error reading or parsing the character content stream. */ protected void processType3Stream(PDType3CharProc charProc, Matrix textRenderingMatrix) - throws IOException + throws IOException { if (currentPage == null) { throw new IllegalStateException("No current page, call " + - "#processChildStream(PDContentStream, PDPage) instead"); + "#processChildStream(PDContentStream, PDPage) instead"); } PDResources parent = pushResources(charProc); Deque savedStack = saveGraphicsStack(); + PDGraphicsState graphicsState = getGraphicsState(); // replace the CTM with the TRM - getGraphicsState().setCurrentTransformationMatrix(textRenderingMatrix); + graphicsState.setCurrentTransformationMatrix(textRenderingMatrix); // transform the CTM using the stream's matrix (this is the FontMatrix) textRenderingMatrix.concatenate(charProc.getMatrix()); // note: we don't clip to the BBox as it is often wrong, see PDFBOX-1917 - // save text matrices (Type 3 stream may contain BT/ET, see PDFBOX-2137) - Matrix textMatrixOld = textMatrix; - textMatrix = new Matrix(); - Matrix textLineMatrixOld = textLineMatrix; - textLineMatrix = new Matrix(); + graphicsState.setTextMatrix(new Matrix()); + graphicsState.setTextLineMatrix(new Matrix()); try { @@ -291,10 +303,6 @@ protected void processType3Stream(PDType3CharProc charProc, Matrix textRendering } finally { - // restore text matrices - textMatrix = textMatrixOld; - textLineMatrix = textLineMatrixOld; - restoreGraphicsStack(savedStack); popResources(parent); } @@ -308,23 +316,25 @@ protected void processType3Stream(PDType3CharProc charProc, Matrix textRendering * @throws IOException If there is an error reading or parsing the appearance content stream. */ protected void processAnnotation(PDAnnotation annotation, PDAppearanceStream appearance) - throws IOException + throws IOException { PDRectangle bbox = appearance.getBBox(); PDRectangle rect = annotation.getRectangle(); - // zero-sized rectangles are not valid + // PDFBOX-4783: zero-sized rectangles are not valid if (rect != null && rect.getWidth() > 0 && rect.getHeight() > 0 && bbox != null && bbox.getWidth() > 0 && bbox.getHeight() > 0) { - PDResources parent = pushResources(appearance); - Deque savedStack = saveGraphicsStack(); - Matrix matrix = appearance.getMatrix(); // transformed appearance box fixme: may be an arbitrary shape RectF transformedBox = new RectF(); bbox.transform(matrix).computeBounds(transformedBox, true); + if (transformedBox.isEmpty()) + { + // PDFBOX-6095: zero-sized rectangles are not valid + return; + } // compute a matrix which scales and translates the transformed appearance box to align // with the edges of the annotation's rectangle @@ -337,10 +347,13 @@ protected void processAnnotation(PDAnnotation annotation, PDAppearanceStream app // Matrix shall be concatenated with A to form a matrix AA that maps from the appearance's // coordinate system to the annotation's rectangle in default user space // - // HOWEVER only the opposite order works for rotated pages with + // HOWEVER only the opposite order works for rotated pages with // filled fields / annotations that have a matrix in the appearance stream, see PDFBOX-3083 Matrix aa = Matrix.concatenate(a, matrix); + PDResources parent = pushResources(appearance); + Deque savedStack = saveGraphicsStack(); + // make matrix AA the CTM getGraphicsState().setCurrentTransformationMatrix(aa); @@ -371,7 +384,7 @@ protected void processAnnotation(PDAnnotation annotation, PDAppearanceStream app * @throws IOException if there is an error reading or parsing the tiling pattern content stream. */ protected final void processTilingPattern(PDTilingPattern tilingPattern, PDColor color, - PDColorSpace colorSpace) throws IOException + PDColorSpace colorSpace) throws IOException { processTilingPattern(tilingPattern, color, colorSpace, tilingPattern.getMatrix()); } @@ -387,8 +400,8 @@ protected final void processTilingPattern(PDTilingPattern tilingPattern, PDColor * @throws IOException if there is an error reading or parsing the tiling pattern content stream. */ protected final void processTilingPattern(PDTilingPattern tilingPattern, PDColor color, - PDColorSpace colorSpace, Matrix patternMatrix) - throws IOException + PDColorSpace colorSpace, Matrix patternMatrix) + throws IOException { PDResources parent = pushResources(tilingPattern); @@ -423,18 +436,12 @@ protected final void processTilingPattern(PDTilingPattern tilingPattern, PDColor // clip to bounding box clipToRect(tilingBBox); - // save text matrices (pattern stream may contain BT/ET, see PDFBOX-4896) - Matrix textMatrixSave = textMatrix; - Matrix textLineMatrixSave = textLineMatrix; - try { processStreamOperators(tilingPattern); } finally { - textMatrix = textMatrixSave; - textLineMatrix = textLineMatrixSave; initialMatrix = parentMatrix; restoreGraphicsStack(savedStack); popResources(parent); @@ -481,7 +488,7 @@ protected void processChildStream(PDContentStream contentStream, PDPage page) th if (isProcessingPage) { throw new IllegalStateException("Current page has already been set via " + - " #processPage(PDPage) call #processChildStream(PDContentStream) instead"); + " #processPage(PDPage) call #processChildStream(PDContentStream) instead"); } initPage(page); processStream(contentStream); @@ -534,18 +541,40 @@ private void processStreamOperators(PDContentStream contentStream) throws IOExce List arguments = new ArrayList(); PDFStreamParser parser = new PDFStreamParser(contentStream); Object token = parser.parseNextToken(); - while (token != null) + + boolean isFirstOperator = true; + boolean oldShouldProcessColorOperators = shouldProcessColorOperators; + shouldProcessColorOperators = true; + if (contentStream instanceof PDTilingPattern && + ((PDTilingPattern) contentStream).getPaintType() == PDTilingPattern.PAINT_UNCOLORED) { - if (token instanceof Operator) - { - processOperator((Operator) token, arguments); - arguments.clear(); - } - else + shouldProcessColorOperators = false; + } + try + { + while (token != null) { - arguments.add((COSBase) token); + if (token instanceof Operator) + { + if (isFirstOperator && contentStream instanceof PDType3CharProc && + OperatorName.TYPE3_D1.equals(((Operator) token).getName())) + { + shouldProcessColorOperators = false; + } + isFirstOperator = false; + processOperator((Operator) token, arguments); + arguments.clear(); + } + else + { + arguments.add((COSBase) token); + } + token = parser.parseNextToken(); } - token = parser.parseNextToken(); + } + finally + { + shouldProcessColorOperators = oldShouldProcessColorOperators; } } @@ -687,7 +716,7 @@ else if (obj instanceof COSArray) else { Log.e("PdfBox-Android", "Unknown type " + obj.getClass().getSimpleName() - + " in array for TJ operation: " + obj); + + " in array for TJ operation: " + obj); } } } @@ -703,7 +732,7 @@ else if (obj instanceof COSArray) protected void applyTextAdjustment(float tx, float ty) throws IOException { // update the text matrix - textMatrix.concatenate(Matrix.getTranslateInstance(tx, ty)); + getGraphicsState().getTextMatrix().translate(tx, ty); } /** @@ -732,9 +761,11 @@ protected void showText(byte[] string) throws IOException // put the text state parameters into matrix form Matrix parameters = new Matrix( - fontSize * horizontalScaling, 0, // 0 - 0, fontSize, // 0 - 0, textState.getRise()); // 1 + fontSize * horizontalScaling, 0, // 0 + 0, fontSize, // 0 + 0, textState.getRise()); // 1 + + Matrix textMatrix = state.getTextMatrix(); // read the stream until it is empty InputStream in = new ByteArrayInputStream(string); @@ -790,7 +821,7 @@ protected void showText(byte[] string) throws IOException } // update the text matrix - textMatrix.concatenate(Matrix.getTranslateInstance(tx, ty)); + textMatrix.translate(tx, ty); } } @@ -808,8 +839,8 @@ protected void showText(byte[] string) throws IOException * @deprecated use {@link #showGlyph(Matrix, PDFont, int, Vector)} instead */ protected void showGlyph(Matrix textRenderingMatrix, PDFont font, int code, - String unicode, - Vector displacement) throws IOException + String unicode, + Vector displacement) throws IOException { if (font instanceof PDType3Font) { @@ -832,7 +863,7 @@ protected void showGlyph(Matrix textRenderingMatrix, PDFont font, int code, * @throws IOException if the glyph cannot be processed */ protected void showGlyph(Matrix textRenderingMatrix, PDFont font, int code, Vector displacement) - throws IOException + throws IOException { // call deprecated method to ensure binary compatibility if not overridden showGlyph(textRenderingMatrix, font, code, font.toUnicode(code), displacement); @@ -852,7 +883,7 @@ protected void showGlyph(Matrix textRenderingMatrix, PDFont font, int code, Vect * @deprecated use {@link #showFontGlyph(Matrix, PDFont, int, Vector)} instead */ protected void showFontGlyph(Matrix textRenderingMatrix, PDFont font, int code, String unicode, - Vector displacement) throws IOException + Vector displacement) throws IOException { // overridden in subclasses } @@ -868,7 +899,7 @@ protected void showFontGlyph(Matrix textRenderingMatrix, PDFont font, int code, * @throws IOException if the glyph cannot be processed */ protected void showFontGlyph(Matrix textRenderingMatrix, PDFont font, int code, - Vector displacement) throws IOException + Vector displacement) throws IOException { // overridden in subclasses // call deprecated method to ensure binary compatibility if not overridden @@ -889,7 +920,7 @@ protected void showFontGlyph(Matrix textRenderingMatrix, PDFont font, int code, * @deprecated use {@link #showType3Glyph(Matrix, PDType3Font, int, Vector)} instead */ protected void showType3Glyph(Matrix textRenderingMatrix, PDType3Font font, int code, - String unicode, Vector displacement) throws IOException + String unicode, Vector displacement) throws IOException { PDType3CharProc charProc = font.getCharProc(code); if (charProc != null) @@ -909,7 +940,7 @@ protected void showType3Glyph(Matrix textRenderingMatrix, PDType3Font font, int * @throws IOException if the glyph cannot be processed */ protected void showType3Glyph(Matrix textRenderingMatrix, PDType3Font font, int code, - Vector displacement) throws IOException + Vector displacement) throws IOException { // call deprecated method to ensure binary compatibility if not overridden showType3Glyph(textRenderingMatrix, font, code, font.toUnicode(code), displacement); @@ -999,23 +1030,27 @@ protected void unsupportedOperator(Operator operator, List operands) th * @throws IOException if something went wrong */ protected void operatorException(Operator operator, List operands, IOException e) - throws IOException + throws IOException { if (e instanceof MissingOperandException || e instanceof MissingResourceException || e instanceof MissingImageReaderException) { - Log.e("PdfBox-Android", e.getMessage()); + Log.e("PdfBox-Android", e.getMessage(), e); } else if (e instanceof EmptyGraphicsStackException) { - Log.w("PdfBox-Android", e.getMessage()); + Log.w("PdfBox-Android", e.getMessage(), e); } else if (operator.getName().equals("Do")) { // todo: this too forgiving, but PDFBox has always worked this way for DrawObject // some careful refactoring is needed - Log.w("PdfBox-Android", e.getMessage()); + Log.w("PdfBox-Android", e.getMessage(), e); + } + else if (e.getCause() instanceof DataFormatException) + { + Log.w("PdfBox-Android", e.getMessage(), e); } else { @@ -1083,7 +1118,7 @@ public PDGraphicsState getGraphicsState() */ public Matrix getTextLineMatrix() { - return textLineMatrix; + return getGraphicsState().getTextLineMatrix(); } /** @@ -1091,7 +1126,7 @@ public Matrix getTextLineMatrix() */ public void setTextLineMatrix(Matrix value) { - textLineMatrix = value; + getGraphicsState().setTextLineMatrix(value); } /** @@ -1099,7 +1134,7 @@ public void setTextLineMatrix(Matrix value) */ public Matrix getTextMatrix() { - return textMatrix; + return getGraphicsState().getTextMatrix(); } /** @@ -1107,7 +1142,7 @@ public Matrix getTextMatrix() */ public void setTextMatrix(Matrix value) { - textMatrix = value; + getGraphicsState().setTextMatrix(value); } /** @@ -1116,11 +1151,6 @@ public void setTextMatrix(Matrix value) */ public void setLineDashPattern(COSArray array, int phase) { - if (phase < 0) - { - Log.w("PdfBox-Android", "Dash phase has negative value " + phase + ", set to 0"); - phase = 0; - } PDLineDashPattern lineDash = new PDLineDashPattern(array, phase); getGraphicsState().setLineDashPattern(lineDash); } @@ -1164,7 +1194,7 @@ public PointF transformedPoint(float x, float y) { float[] position = { x, y }; getGraphicsState().getCurrentTransformationMatrix().createAffineTransform() - .transform(position, 0, position, 0, 1); + .transform(position, 0, position, 0, 1); return new PointF(position[0], position[1]); } @@ -1215,4 +1245,16 @@ public void decreaseLevel() Log.e("PdfBox-Android", "level is " + level); } } + + /** + * Tells whether color operators should be processed. To be used in some OperatorProcessor + * classes. + * + * @return true if color operators should be processed, false if not, e.g. in type3 charprocs + * with d1 or in uncolored tiling patterns. + */ + public boolean isShouldProcessColorOperators() + { + return shouldProcessColorOperators; + } } diff --git a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/color/SetColor.java b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/color/SetColor.java index 5928da486..262351625 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/color/SetColor.java +++ b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/color/SetColor.java @@ -27,7 +27,6 @@ import com.tom_roush.pdfbox.cos.COSNumber; import com.tom_roush.pdfbox.pdmodel.graphics.color.PDColor; import com.tom_roush.pdfbox.pdmodel.graphics.color.PDColorSpace; - /** * sc,scn,SC,SCN: Sets the color to use for stroking or non-stroking operations. * @@ -39,7 +38,8 @@ public abstract class SetColor extends OperatorProcessor public void process(Operator operator, List arguments) throws IOException { PDColorSpace colorSpace = getColorSpace(); -// if (!(colorSpace instanceof PDPattern)) TODO: PdfBox-Android + // TODO: PdfBox-Android: Pattern colorspace not supported +// if (!(colorSpace instanceof PDPattern)) { if (arguments.size() < colorSpace.getNumberOfComponents()) { @@ -47,6 +47,9 @@ public void process(Operator operator, List arguments) throws IOExcepti } if (!checkArrayTypesClass(arguments, COSNumber.class)) { + // PDFBOX-5851: set an invalid color because Pattern colorspace is missing + // this will produce transparency in PageDrawer + setColor(new PDColor(new float[0], null)); return; } } diff --git a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/color/SetNonStrokingColorSpace.java b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/color/SetNonStrokingColorSpace.java index 9e7c4cacb..30fd793a1 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/color/SetNonStrokingColorSpace.java +++ b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/color/SetNonStrokingColorSpace.java @@ -19,13 +19,12 @@ import java.io.IOException; import java.util.List; -import com.tom_roush.pdfbox.cos.COSBase; -import com.tom_roush.pdfbox.cos.COSName; -import com.tom_roush.pdfbox.pdmodel.graphics.color.PDColorSpace; import com.tom_roush.pdfbox.contentstream.operator.Operator; import com.tom_roush.pdfbox.contentstream.operator.OperatorName; import com.tom_roush.pdfbox.contentstream.operator.OperatorProcessor; - +import com.tom_roush.pdfbox.cos.COSBase; +import com.tom_roush.pdfbox.cos.COSName; +import com.tom_roush.pdfbox.pdmodel.graphics.color.PDColorSpace; /** * cs: Sets the non-stroking color space. * @@ -37,6 +36,10 @@ public class SetNonStrokingColorSpace extends OperatorProcessor @Override public void process(Operator operator, List arguments) throws IOException { + if (!context.isShouldProcessColorOperators()) + { + return; + } if (arguments.isEmpty()) { return; diff --git a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/color/SetNonStrokingDeviceCMYKColor.java b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/color/SetNonStrokingDeviceCMYKColor.java index 7af3617a2..b11cbe87b 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/color/SetNonStrokingDeviceCMYKColor.java +++ b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/color/SetNonStrokingDeviceCMYKColor.java @@ -24,7 +24,6 @@ import com.tom_roush.pdfbox.cos.COSBase; import com.tom_roush.pdfbox.cos.COSName; import com.tom_roush.pdfbox.pdmodel.graphics.color.PDColorSpace; - /** * k: Set the non-stroking colour space to DeviceCMYK and set the colour to * use for non-stroking operations. @@ -36,6 +35,10 @@ public class SetNonStrokingDeviceCMYKColor extends SetNonStrokingColor @Override public void process(Operator operator, List arguments) throws IOException { + if (!context.isShouldProcessColorOperators()) + { + return; + } PDColorSpace cs = context.getResources().getColorSpace(COSName.DEVICECMYK); context.getGraphicsState().setNonStrokingColorSpace(cs); super.process(operator, arguments); diff --git a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/color/SetNonStrokingDeviceGrayColor.java b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/color/SetNonStrokingDeviceGrayColor.java index 13d656a9d..ec2dfd65f 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/color/SetNonStrokingDeviceGrayColor.java +++ b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/color/SetNonStrokingDeviceGrayColor.java @@ -24,7 +24,6 @@ import com.tom_roush.pdfbox.cos.COSBase; import com.tom_roush.pdfbox.cos.COSName; import com.tom_roush.pdfbox.pdmodel.graphics.color.PDColorSpace; - /** * g: Set the non-stroking colour space to DeviceGray and set the gray * level to use for non-stroking operations. @@ -36,6 +35,10 @@ public class SetNonStrokingDeviceGrayColor extends SetNonStrokingColor @Override public void process(Operator operator, List arguments) throws IOException { + if (!context.isShouldProcessColorOperators()) + { + return; + } PDColorSpace cs = context.getResources().getColorSpace(COSName.DEVICEGRAY); context.getGraphicsState().setNonStrokingColorSpace(cs); super.process(operator, arguments); diff --git a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/color/SetNonStrokingDeviceRGBColor.java b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/color/SetNonStrokingDeviceRGBColor.java index d545ab7c9..ae26054dc 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/color/SetNonStrokingDeviceRGBColor.java +++ b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/color/SetNonStrokingDeviceRGBColor.java @@ -24,7 +24,6 @@ import com.tom_roush.pdfbox.cos.COSBase; import com.tom_roush.pdfbox.cos.COSName; import com.tom_roush.pdfbox.pdmodel.graphics.color.PDColorSpace; - /** * rg: Set the non-stroking colour space to DeviceRGB and set the colour to * use for non-stroking operations. @@ -36,6 +35,10 @@ public class SetNonStrokingDeviceRGBColor extends SetNonStrokingColor @Override public void process(Operator operator, List arguments) throws IOException { + if (!context.isShouldProcessColorOperators()) + { + return; + } PDColorSpace cs = context.getResources().getColorSpace(COSName.DEVICERGB); context.getGraphicsState().setNonStrokingColorSpace(cs); super.process(operator, arguments); diff --git a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/color/SetStrokingColorSpace.java b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/color/SetStrokingColorSpace.java index 76e147de4..9cac6135f 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/color/SetStrokingColorSpace.java +++ b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/color/SetStrokingColorSpace.java @@ -19,13 +19,12 @@ import java.io.IOException; import java.util.List; -import com.tom_roush.pdfbox.cos.COSBase; -import com.tom_roush.pdfbox.cos.COSName; -import com.tom_roush.pdfbox.pdmodel.graphics.color.PDColorSpace; import com.tom_roush.pdfbox.contentstream.operator.Operator; import com.tom_roush.pdfbox.contentstream.operator.OperatorName; import com.tom_roush.pdfbox.contentstream.operator.OperatorProcessor; - +import com.tom_roush.pdfbox.cos.COSBase; +import com.tom_roush.pdfbox.cos.COSName; +import com.tom_roush.pdfbox.pdmodel.graphics.color.PDColorSpace; /** * CS: Set color space for stroking operations. * @@ -37,6 +36,10 @@ public class SetStrokingColorSpace extends OperatorProcessor @Override public void process(Operator operator, List arguments) throws IOException { + if (!context.isShouldProcessColorOperators()) + { + return; + } if (arguments.isEmpty()) { return; diff --git a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/color/SetStrokingDeviceCMYKColor.java b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/color/SetStrokingDeviceCMYKColor.java index 48cb1d860..3cd7c8921 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/color/SetStrokingDeviceCMYKColor.java +++ b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/color/SetStrokingDeviceCMYKColor.java @@ -24,7 +24,6 @@ import com.tom_roush.pdfbox.cos.COSBase; import com.tom_roush.pdfbox.cos.COSName; import com.tom_roush.pdfbox.pdmodel.graphics.color.PDColorSpace; - /** * K: Set the stroking colour space to DeviceCMYK and set the colour to use for stroking operations. * @@ -35,6 +34,10 @@ public class SetStrokingDeviceCMYKColor extends SetStrokingColor @Override public void process(Operator operator, List arguments) throws IOException { + if (!context.isShouldProcessColorOperators()) + { + return; + } PDColorSpace cs = context.getResources().getColorSpace(COSName.DEVICECMYK); context.getGraphicsState().setStrokingColorSpace(cs); super.process(operator, arguments); diff --git a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/color/SetStrokingDeviceGrayColor.java b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/color/SetStrokingDeviceGrayColor.java index 78e0f2842..157ae85f5 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/color/SetStrokingDeviceGrayColor.java +++ b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/color/SetStrokingDeviceGrayColor.java @@ -24,7 +24,6 @@ import com.tom_roush.pdfbox.cos.COSBase; import com.tom_roush.pdfbox.cos.COSName; import com.tom_roush.pdfbox.pdmodel.graphics.color.PDColorSpace; - /** * G: Set the stroking colour space to DeviceGray and set the gray level to use for stroking * operations. @@ -33,8 +32,13 @@ */ public class SetStrokingDeviceGrayColor extends SetStrokingColor { + @Override public void process(Operator operator, List arguments) throws IOException { + if (!context.isShouldProcessColorOperators()) + { + return; + } PDColorSpace cs = context.getResources().getColorSpace(COSName.DEVICEGRAY); context.getGraphicsState().setStrokingColorSpace(cs); super.process(operator, arguments); diff --git a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/color/SetStrokingDeviceRGBColor.java b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/color/SetStrokingDeviceRGBColor.java index 649736fe6..1c38079b0 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/color/SetStrokingDeviceRGBColor.java +++ b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/color/SetStrokingDeviceRGBColor.java @@ -24,7 +24,6 @@ import com.tom_roush.pdfbox.cos.COSBase; import com.tom_roush.pdfbox.cos.COSName; import com.tom_roush.pdfbox.pdmodel.graphics.color.PDColorSpace; - /** * RG: Set the stroking colour space to DeviceRGB and set the colour to use for stroking operations. * @@ -40,8 +39,13 @@ public class SetStrokingDeviceRGBColor extends SetStrokingColor * @param arguments List * @throws IOException If the color space cannot be read. */ + @Override public void process(Operator operator, List arguments) throws IOException { + if (!context.isShouldProcessColorOperators()) + { + return; + } PDColorSpace cs = context.getResources().getColorSpace(COSName.DEVICERGB); context.getGraphicsState().setStrokingColorSpace(cs); super.process(operator, arguments); diff --git a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/graphics/BeginInlineImage.java b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/graphics/BeginInlineImage.java index 8531baeb0..edb12d7dd 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/graphics/BeginInlineImage.java +++ b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/graphics/BeginInlineImage.java @@ -19,12 +19,11 @@ import java.io.IOException; import java.util.List; +import com.tom_roush.pdfbox.contentstream.operator.Operator; +import com.tom_roush.pdfbox.contentstream.operator.OperatorName; import com.tom_roush.pdfbox.cos.COSBase; import com.tom_roush.pdfbox.pdmodel.graphics.image.PDImage; import com.tom_roush.pdfbox.pdmodel.graphics.image.PDInlineImage; -import com.tom_roush.pdfbox.contentstream.operator.Operator; -import com.tom_roush.pdfbox.contentstream.operator.OperatorName; - /** * BI Begins an inline image. * @@ -40,8 +39,12 @@ public void process(Operator operator, List operands) throws IOExceptio return; } PDImage image = new PDInlineImage(operator.getImageParameters(), - operator.getImageData(), - context.getResources()); + operator.getImageData(), + context.getResources()); + if (!image.isStencil() && !context.isShouldProcessColorOperators()) + { + return; + } context.drawImage(image); } diff --git a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/graphics/CurveToReplicateFinalPoint.java b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/graphics/CurveToReplicateFinalPoint.java index ee2b78472..9ae0a4079 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/graphics/CurveToReplicateFinalPoint.java +++ b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/graphics/CurveToReplicateFinalPoint.java @@ -17,6 +17,7 @@ package com.tom_roush.pdfbox.contentstream.operator.graphics; import android.graphics.PointF; +import android.util.Log; import java.io.IOException; import java.util.List; @@ -26,7 +27,6 @@ import com.tom_roush.pdfbox.contentstream.operator.OperatorName; import com.tom_roush.pdfbox.cos.COSBase; import com.tom_roush.pdfbox.cos.COSNumber; - /** * y Append curved segment to path with final point replicated. * @@ -34,6 +34,7 @@ */ public final class CurveToReplicateFinalPoint extends GraphicsOperatorProcessor { + @Override public void process(Operator operator, List operands) throws IOException { @@ -50,12 +51,22 @@ public void process(Operator operator, List operands) throws IOExceptio COSNumber x3 = (COSNumber)operands.get(2); COSNumber y3 = (COSNumber)operands.get(3); + PointF currentPoint = context.getCurrentPoint(); + PointF point1 = context.transformedPoint(x1.floatValue(), y1.floatValue()); PointF point3 = context.transformedPoint(x3.floatValue(), y3.floatValue()); - context.curveTo(point1.x, point1.y, - point3.x, point3.y, - point3.x, point3.y); + if (currentPoint == null) + { + Log.w("PdfBox-Android", "curveTo (" + point3.x + "," + point3.y + ") without initial MoveTo"); + context.moveTo(point3.x, point3.y); + } + else + { + context.curveTo(point1.x, point1.y, + point3.x, point3.y, + point3.x, point3.y); + } } @Override diff --git a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/graphics/DrawObject.java b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/graphics/DrawObject.java index 99dce1969..e78c9e17e 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/graphics/DrawObject.java +++ b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/graphics/DrawObject.java @@ -31,7 +31,6 @@ import com.tom_roush.pdfbox.pdmodel.graphics.form.PDFormXObject; import com.tom_roush.pdfbox.pdmodel.graphics.form.PDTransparencyGroup; import com.tom_roush.pdfbox.pdmodel.graphics.image.PDImageXObject; - /** * Do: Draws an XObject. * @@ -40,6 +39,7 @@ */ public final class DrawObject extends GraphicsOperatorProcessor { + @Override public void process(Operator operator, List operands) throws IOException { @@ -61,7 +61,11 @@ public void process(Operator operator, List operands) throws IOExceptio } else if (xobject instanceof PDImageXObject) { - PDImageXObject image = (PDImageXObject)xobject; + PDImageXObject image = (PDImageXObject) xobject; + if (!image.isStencil() && !context.isShouldProcessColorOperators()) + { + return; + } context.drawImage(image); } else if (xobject instanceof PDFormXObject) diff --git a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/graphics/ShadingFill.java b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/graphics/ShadingFill.java index a9e9b9297..ec8720514 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/graphics/ShadingFill.java +++ b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/graphics/ShadingFill.java @@ -20,11 +20,10 @@ import java.util.List; import com.tom_roush.pdfbox.contentstream.operator.MissingOperandException; -import com.tom_roush.pdfbox.cos.COSBase; -import com.tom_roush.pdfbox.cos.COSName; import com.tom_roush.pdfbox.contentstream.operator.Operator; import com.tom_roush.pdfbox.contentstream.operator.OperatorName; - +import com.tom_roush.pdfbox.cos.COSBase; +import com.tom_roush.pdfbox.cos.COSName; /** * sh Fills the clipping area with the given shading pattern. * @@ -39,7 +38,12 @@ public void process(Operator operator, List operands) throws IOExceptio { throw new MissingOperandException(operator, operands); } - context.shadingFill((COSName) operands.get(0)); + COSBase base = operands.get(0); + if (!(base instanceof COSName)) + { + throw new MissingOperandException(operator, operands); + } + context.shadingFill((COSName) base); } @Override diff --git a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/markedcontent/BeginMarkedContentSequenceWithProperties.java b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/markedcontent/BeginMarkedContentSequenceWithProperties.java index 01b485be0..b14de2dd1 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/markedcontent/BeginMarkedContentSequenceWithProperties.java +++ b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/markedcontent/BeginMarkedContentSequenceWithProperties.java @@ -19,13 +19,14 @@ import java.io.IOException; import java.util.List; -import com.tom_roush.pdfbox.cos.COSBase; -import com.tom_roush.pdfbox.cos.COSDictionary; -import com.tom_roush.pdfbox.cos.COSName; +import com.tom_roush.pdfbox.contentstream.operator.MissingOperandException; import com.tom_roush.pdfbox.contentstream.operator.Operator; import com.tom_roush.pdfbox.contentstream.operator.OperatorName; import com.tom_roush.pdfbox.contentstream.operator.OperatorProcessor; - +import com.tom_roush.pdfbox.cos.COSBase; +import com.tom_roush.pdfbox.cos.COSDictionary; +import com.tom_roush.pdfbox.cos.COSName; +import com.tom_roush.pdfbox.pdmodel.documentinterchange.markedcontent.PDPropertyList; /** * BDC : Begins a marked-content sequence with property list. * @@ -34,22 +35,38 @@ public class BeginMarkedContentSequenceWithProperties extends OperatorProcessor { @Override - public void process(Operator operator, List arguments) throws IOException + public void process(Operator operator, List operands) throws IOException { - COSName tag = null; - COSDictionary properties = null; - for (COSBase argument : arguments) + if (operands.size() < 2) { - if (argument instanceof COSName) - { - tag = (COSName) argument; - } - else if (argument instanceof COSDictionary) + throw new MissingOperandException(operator, operands); + } + if (!(operands.get(0) instanceof COSName)) + { + return; + } + COSName tag = (COSName) operands.get(0); + COSBase op1 = operands.get(1); + COSDictionary propDict = null; + if (op1 instanceof COSName) + { + // PDFBOX-5980 and SO79549651 + PDPropertyList prop = context.getResources().getProperties((COSName) op1); + if (prop != null) { - properties = (COSDictionary) argument; + propDict = prop.getCOSObject(); } } - context.beginMarkedContentSequence(tag, properties); + else if (op1 instanceof COSDictionary) + { + propDict = (COSDictionary) op1; + } + if (propDict == null) + { + // wrong type or property not found + return; + } + context.beginMarkedContentSequence(tag, propDict); } @Override diff --git a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/state/SetLineCapStyle.java b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/state/SetLineCapStyle.java index 84702f0b6..d555c8b6a 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/state/SetLineCapStyle.java +++ b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/state/SetLineCapStyle.java @@ -27,7 +27,6 @@ import com.tom_roush.pdfbox.contentstream.operator.OperatorProcessor; import com.tom_roush.pdfbox.cos.COSBase; import com.tom_roush.pdfbox.cos.COSNumber; - /** * J: Set the line cap style. * @@ -41,6 +40,10 @@ public void process(Operator operator, List arguments) throws IOExcepti { throw new MissingOperandException(operator, arguments); } + if (!checkArrayTypesClass(arguments, COSNumber.class)) + { + return; + } Paint.Cap lineCapStyle; switch (((COSNumber)arguments.get( 0 )).intValue()) { diff --git a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/state/SetLineJoinStyle.java b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/state/SetLineJoinStyle.java index 2e4ae8215..70e937aff 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/state/SetLineJoinStyle.java +++ b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/state/SetLineJoinStyle.java @@ -27,7 +27,6 @@ import com.tom_roush.pdfbox.contentstream.operator.OperatorProcessor; import com.tom_roush.pdfbox.cos.COSBase; import com.tom_roush.pdfbox.cos.COSNumber; - /** * j: Set the line join style. * @@ -41,6 +40,10 @@ public void process(Operator operator, List arguments) throws IOExcepti { throw new MissingOperandException(operator, arguments); } + if (!checkArrayTypesClass(arguments, COSNumber.class)) + { + return; + } Paint.Join lineJoinStyle; switch (((COSNumber)arguments.get( 0 )).intValue()) { diff --git a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/state/SetLineMiterLimit.java b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/state/SetLineMiterLimit.java index 49d2dee38..74137486e 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/state/SetLineMiterLimit.java +++ b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/state/SetLineMiterLimit.java @@ -25,8 +25,6 @@ import com.tom_roush.pdfbox.contentstream.operator.OperatorProcessor; import com.tom_roush.pdfbox.cos.COSBase; import com.tom_roush.pdfbox.cos.COSNumber; - - /** * M: Set miter limit. * @@ -40,6 +38,10 @@ public void process(Operator operator, List arguments) throws IOExcepti { throw new MissingOperandException(operator, arguments); } + if (!checkArrayTypesClass(arguments, COSNumber.class)) + { + return; + } COSNumber miterLimit = (COSNumber)arguments.get( 0 ); context.getGraphicsState().setMiterLimit(miterLimit.floatValue()); } diff --git a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/state/SetLineWidth.java b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/state/SetLineWidth.java index 5655f510b..e08599c9f 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/state/SetLineWidth.java +++ b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/state/SetLineWidth.java @@ -25,7 +25,6 @@ import com.tom_roush.pdfbox.contentstream.operator.OperatorProcessor; import com.tom_roush.pdfbox.cos.COSBase; import com.tom_roush.pdfbox.cos.COSNumber; - /** * w: Set line width. * @@ -40,6 +39,10 @@ public void process(Operator operator, List arguments) throws IOExcepti { throw new MissingOperandException(operator, arguments); } + if (!checkArrayTypesClass(arguments, COSNumber.class)) + { + return; + } COSNumber width = (COSNumber) arguments.get(0); context.getGraphicsState().setLineWidth(width.floatValue()); } diff --git a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/text/SetFontAndSize.java b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/text/SetFontAndSize.java index 2f7218931..2d48e68f6 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/text/SetFontAndSize.java +++ b/library/src/main/java/com/tom_roush/pdfbox/contentstream/operator/text/SetFontAndSize.java @@ -30,7 +30,7 @@ import com.tom_roush.pdfbox.cos.COSName; import com.tom_roush.pdfbox.cos.COSNumber; import com.tom_roush.pdfbox.pdmodel.font.PDFont; - +import com.tom_roush.pdfbox.pdmodel.graphics.state.PDTextState; /** * Tf: Set text font and size. * @@ -38,6 +38,7 @@ */ public class SetFontAndSize extends OperatorProcessor { + @Override public void process(Operator operator, List arguments) throws IOException { @@ -58,13 +59,16 @@ public void process(Operator operator, List arguments) throws IOExcepti } COSName fontName = (COSName) base0; float fontSize = ((COSNumber) base1).floatValue(); - context.getGraphicsState().getTextState().setFontSize(fontSize); + PDTextState textState = context.getGraphicsState().getTextState(); + textState.setFontSize(fontSize); + // Get the font after the size has been set in case there is an exception + // so that PDFBox will use a default font PDFont font = context.getResources().getFont(fontName); if (font == null) { Log.w("PdfBox-Android", "font '" + fontName.getName() + "' not found in resources"); } - context.getGraphicsState().getTextState().setFont(font); + textState.setFont(font); } @Override diff --git a/library/src/main/java/com/tom_roush/pdfbox/cos/COSArray.java b/library/src/main/java/com/tom_roush/pdfbox/cos/COSArray.java index a2fa86819..f9607c727 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/cos/COSArray.java +++ b/library/src/main/java/com/tom_roush/pdfbox/cos/COSArray.java @@ -23,7 +23,6 @@ import java.util.List; import com.tom_roush.pdfbox.pdmodel.common.COSObjectable; - /** * An array of PDFBase objects as part of the PDF document. * @@ -117,12 +116,14 @@ public void addAll( Collection objectsList ) * * @param objectList The list of objects to add. */ - public void addAll( COSArray objectList ) + public void addAll(COSArray objectList) { - if( objectList != null ) + if (objectList == null) { - objects.addAll( objectList.objects ); + return; } + + objects.addAll(objectList.objects); } /** @@ -472,11 +473,18 @@ public int indexOfObject(COSBase object) return i; } } - else if (item.equals(object) - || item instanceof COSObject && ((COSObject) item).getObject().equals(object)) + else if (item.equals(object)) { return i; } + else if (item instanceof COSObject) + { + COSBase cosBase = ((COSObject) item).getObject(); + if (cosBase != null && cosBase.equals(object)) + { + return i; + } + } } return -1; } @@ -525,7 +533,7 @@ public Object accept(ICOSVisitor visitor) throws IOException @Override public boolean isNeedToBeUpdated() { - return needToBeUpdated; + return needToBeUpdated; } /** @@ -540,7 +548,7 @@ public boolean isNeedToBeUpdated() @Override public void setNeedToBeUpdated(boolean flag) { - needToBeUpdated = flag; + needToBeUpdated = flag; } /** diff --git a/library/src/main/java/com/tom_roush/pdfbox/cos/COSDictionary.java b/library/src/main/java/com/tom_roush/pdfbox/cos/COSDictionary.java index 1a56f17bc..8f1e9cd30 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/cos/COSDictionary.java +++ b/library/src/main/java/com/tom_roush/pdfbox/cos/COSDictionary.java @@ -16,6 +16,8 @@ */ package com.tom_roush.pdfbox.cos; +import android.graphics.Rect; + import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; @@ -31,7 +33,6 @@ import com.tom_roush.pdfbox.pdmodel.common.COSObjectable; import com.tom_roush.pdfbox.util.DateConverter; import com.tom_roush.pdfbox.util.SmallMap; - /** * This class represents a dictionary where name/value pairs reside. * @@ -96,8 +97,9 @@ public COSName getKeyForValue(Object value) { Object nextValue = entry.getValue(); if (nextValue.equals(value) - || (nextValue instanceof COSObject && ((COSObject) nextValue).getObject() - .equals(value))) + || (nextValue instanceof COSObject && + ((COSObject) nextValue).getObject() != null && + ((COSObject) nextValue).getObject().equals(value))) { return entry.getKey(); } @@ -937,7 +939,7 @@ public Calendar getEmbeddedDate(String embedded, COSName key) throws IOException * @throws IOException If there is an error converting to a date. */ public Calendar getEmbeddedDate(String embedded, String key, Calendar defaultValue) - throws IOException + throws IOException { return getEmbeddedDate(embedded, COSName.getPDFName(key), defaultValue); } @@ -952,7 +954,7 @@ public Calendar getEmbeddedDate(String embedded, String key, Calendar defaultVal * @throws IOException If there is an error converting to a date. */ public Calendar getEmbeddedDate(String embedded, COSName key, Calendar defaultValue) - throws IOException + throws IOException { Calendar retval = defaultValue; COSDictionary eDic = (COSDictionary) getDictionaryObject(embedded); @@ -1431,13 +1433,13 @@ public Object accept(ICOSVisitor visitor) throws IOException @Override public boolean isNeedToBeUpdated() { - return needToBeUpdated; + return needToBeUpdated; } @Override public void setNeedToBeUpdated(boolean flag) { - needToBeUpdated = flag; + needToBeUpdated = flag; } /** @@ -1561,11 +1563,11 @@ private static String getDictionaryString(COSBase base, List objs) thro if (objs.contains(base)) { // avoid endless recursion - return String.valueOf(base.hashCode()); + return "hash:" + base.hashCode(); } - objs.add(base); if (base instanceof COSDictionary) { + objs.add(base); StringBuilder sb = new StringBuilder("COSDictionary{"); for (Map.Entry x : ((COSDictionary) base).entrySet()) { @@ -1586,6 +1588,7 @@ private static String getDictionaryString(COSBase base, List objs) thro } if (base instanceof COSArray) { + objs.add(base); StringBuilder sb = new StringBuilder("COSArray{"); for (COSBase x : ((COSArray) base)) { @@ -1597,6 +1600,7 @@ private static String getDictionaryString(COSBase base, List objs) thro } if (base instanceof COSObject) { + objs.add(base); COSObject obj = (COSObject) base; return "COSObject{" + getDictionaryString(obj.getObject(), objs) + "}"; } diff --git a/library/src/main/java/com/tom_roush/pdfbox/cos/COSDocument.java b/library/src/main/java/com/tom_roush/pdfbox/cos/COSDocument.java index 572820bf2..2035b9ba0 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/cos/COSDocument.java +++ b/library/src/main/java/com/tom_roush/pdfbox/cos/COSDocument.java @@ -30,7 +30,6 @@ import com.tom_roush.pdfbox.multipdf.Splitter; import com.tom_roush.pdfbox.pdfparser.PDFObjectStreamParser; import com.tom_roush.pdfbox.pdmodel.PDDocument; - /** * This is the in-memory representation of the PDF document. You need to call * close() on this object when you are done using it!! @@ -40,7 +39,6 @@ */ public class COSDocument extends COSBase implements Closeable { - private float version = 1.4f; /** @@ -57,7 +55,7 @@ public class COSDocument extends COSBase implements Closeable new HashMap(); /** - * List containing all streams which are created when creating a new pdf. + * List containing all streams which are created when creating a new pdf. */ private final List streams = new ArrayList(); @@ -69,7 +67,7 @@ public class COSDocument extends COSBase implements Closeable private boolean warnMissingClose = true; /** - * Signal that document is already decrypted. + * Signal that document is already decrypted. */ private boolean isDecrypted = false; @@ -350,7 +348,10 @@ public COSArray getDocumentID() } /** - * This will set the document ID. + * This will set the document ID. This should be an array of two strings. This method cannot be + * used to remove the document id by passing null or an empty array; it will be recreated. Only + * the first existing string is used when writing, the second one is always recreated. If you + * don't want this, you'll have to modify the {@code COSWriter} class, look for {@link COSName#ID}. * * @param id The document id. */ @@ -516,7 +517,7 @@ protected void finalize() throws IOException { if (warnMissingClose) { - Log.w("PdfBox-Android", "Warning: You did not close a PDF Document" ); + Log.w("PdfBox-Android", "Warning: You did not close a PDF Document" ); } close(); } @@ -551,9 +552,9 @@ public void dereferenceObjectStreams() throws IOException { COSObjectKey key = new COSObjectKey(next); if (objectPool.get(key) == null || objectPool.get(key).getObject() == null - // xrefTable stores negated objNr of objStream for objects in objStreams - || (xrefTable.containsKey(key) - && xrefTable.get(key) == -objStream.getObjectNumber())) + // xrefTable stores negated objNr of objStream for objects in objStreams + || (xrefTable.containsKey(key) + && xrefTable.get(key) == -objStream.getObjectNumber())) { COSObject obj = getObjectFromPool(key); obj.setObject(next.getObject()); @@ -623,7 +624,7 @@ public Map getXrefTable() } /** - * This method set the startxref value of the document. This will only + * This method set the startxref value of the document. This will only * be needed for incremental updates. * * @param startXrefValue the value for startXref @@ -640,7 +641,7 @@ public void setStartXref(long startXrefValue) */ public long getStartXref() { - return startXref; + return startXref; } /** diff --git a/library/src/main/java/com/tom_roush/pdfbox/cos/COSFloat.java b/library/src/main/java/com/tom_roush/pdfbox/cos/COSFloat.java index f4604de3d..d8bc8eb87 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/cos/COSFloat.java +++ b/library/src/main/java/com/tom_roush/pdfbox/cos/COSFloat.java @@ -19,7 +19,6 @@ import java.io.IOException; import java.io.OutputStream; import java.math.BigDecimal; - /** * This class represents a floating point number in a PDF document. * @@ -38,7 +37,7 @@ public class COSFloat extends COSNumber */ public COSFloat( float aFloat ) { - // use a BigDecimal as intermediate state to avoid + // use a BigDecimal as intermediate state to avoid // a floating point string representation of the float value value = new BigDecimal(String.valueOf(aFloat)); valueAsString = removeNullDigits(value.toPlainString()); @@ -73,6 +72,11 @@ else if (aFloat.matches("^0\\.0*\\-\\d+")) // PDFBOX-3500 has 0.-262 valueAsString = "-" + valueAsString.replaceFirst("\\-", ""); } + else if (aFloat.matches("^-\\d+\\.-\\d+")) + { + // PDFBOX-5829 has -12.-1 + valueAsString = "-" + valueAsString.replace("-", ""); + } else { throw new IOException("Error expected floating point number actual='" + aFloat + "'", e); @@ -184,7 +188,7 @@ public int intValue() public boolean equals( Object o ) { return o instanceof COSFloat && - Float.floatToIntBits(((COSFloat)o).value.floatValue()) == Float.floatToIntBits(value.floatValue()); + Float.floatToIntBits(((COSFloat)o).value.floatValue()) == Float.floatToIntBits(value.floatValue()); } /** diff --git a/library/src/main/java/com/tom_roush/pdfbox/cos/COSInputStream.java b/library/src/main/java/com/tom_roush/pdfbox/cos/COSInputStream.java index 5df86e1bf..943b80238 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/cos/COSInputStream.java +++ b/library/src/main/java/com/tom_roush/pdfbox/cos/COSInputStream.java @@ -17,13 +17,14 @@ package com.tom_roush.pdfbox.cos; +import android.util.Log; + import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; -import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -35,7 +36,6 @@ import com.tom_roush.pdfbox.io.RandomAccessInputStream; import com.tom_roush.pdfbox.io.RandomAccessOutputStream; import com.tom_roush.pdfbox.io.ScratchFile; - /** * An InputStream which reads from an encoded COS stream. * @@ -43,6 +43,7 @@ */ public final class COSInputStream extends FilterInputStream { + /** * Creates a new COSInputStream from an encoded input stream. * @@ -50,22 +51,17 @@ public final class COSInputStream extends FilterInputStream * @param parameters Filter parameters. * @param in Encoded input stream. * @param scratchFile Scratch file to use, or null. + * @param options decode options for the encoded stream * @return Decoded stream. * @throws IOException If the stream could not be read. */ static COSInputStream create(List filters, COSDictionary parameters, InputStream in, - ScratchFile scratchFile) throws IOException - { - return create(filters, parameters, in, scratchFile, DecodeOptions.DEFAULT); - } - - static COSInputStream create(List filters, COSDictionary parameters, InputStream in, - ScratchFile scratchFile, DecodeOptions options) throws IOException + ScratchFile scratchFile, DecodeOptions options) throws IOException { InputStream input = in; if (filters.isEmpty()) { - return new COSInputStream(in, Collections.emptyList()); + return new COSInputStream(in, null); } List results = new ArrayList(filters.size()); @@ -74,7 +70,17 @@ static COSInputStream create(List filters, COSDictionary parameters, Inp Set filterSet = new HashSet(filters); if (filterSet.size() != filters.size()) { - throw new IOException("Duplicate"); + List reducedFilterList = new ArrayList(); + for (Filter filter : filters) + { + if (!reducedFilterList.contains(filter)) + { + reducedFilterList.add(filter); + } + } + // replace origin list with the reduced one + filters = reducedFilterList; + Log.w("PdfBox-Android", "Removed duplicated filter entries"); } } // apply filters @@ -104,37 +110,38 @@ public void close() throws IOException input = new ByteArrayInputStream(output.toByteArray()); } } - return new COSInputStream(input, results); + if (results.isEmpty()) + { + return new COSInputStream(in, null); + } + return new COSInputStream(input, results.get(results.size() - 1)); } - private final List decodeResults; + private final DecodeResult decodeResult; /** * Constructor. * * @param input decoded stream - * @param decodeResults results of decoding + * @param decodeResult result of decoding */ - private COSInputStream(InputStream input, List decodeResults) + private COSInputStream(InputStream input, DecodeResult decodeResult) { super(input); - this.decodeResults = decodeResults; + this.decodeResult = decodeResult; } /** * Returns the result of the last filter, for use by repair mechanisms. * - * @return the result of the decoding. + * @return the result of the last filter */ public DecodeResult getDecodeResult() { - if (decodeResults.isEmpty()) + if (decodeResult == null) { return DecodeResult.DEFAULT; } - else - { - return decodeResults.get(decodeResults.size() - 1); - } + return decodeResult; } } diff --git a/library/src/main/java/com/tom_roush/pdfbox/cos/COSInteger.java b/library/src/main/java/com/tom_roush/pdfbox/cos/COSInteger.java index 27cfdc646..c1c55fd3d 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/cos/COSInteger.java +++ b/library/src/main/java/com/tom_roush/pdfbox/cos/COSInteger.java @@ -18,7 +18,6 @@ import java.io.IOException; import java.io.OutputStream; - /** * This class represents an integer number in a PDF document. * @@ -70,12 +69,12 @@ public final class COSInteger extends COSNumber /** * Constant for an out of range value which is bigger than Log.MAX_VALUE. */ - protected static final COSInteger OUT_OF_RANGE_MAX = getInvalid(true); + static final COSInteger OUT_OF_RANGE_MAX = getInvalid(true); /** * Constant for an out of range value which is smaller than Log.MIN_VALUE. */ - protected static final COSInteger OUT_OF_RANGE_MIN = getInvalid(false); + static final COSInteger OUT_OF_RANGE_MIN = getInvalid(false); /** * Returns a COSInteger instance with the given value. @@ -101,7 +100,7 @@ public static COSInteger get(long val) private static COSInteger getInvalid(boolean maxValue) { return maxValue ? new COSInteger(Long.MAX_VALUE, false) - : new COSInteger(Long.MIN_VALUE, false); + : new COSInteger(Long.MIN_VALUE, false); } private final long value; diff --git a/library/src/main/java/com/tom_roush/pdfbox/cos/COSName.java b/library/src/main/java/com/tom_roush/pdfbox/cos/COSName.java index 7935be826..227b11052 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/cos/COSName.java +++ b/library/src/main/java/com/tom_roush/pdfbox/cos/COSName.java @@ -16,15 +16,19 @@ */ package com.tom_roush.pdfbox.cos; +import android.graphics.Path; +import android.graphics.Rect; + import java.io.IOException; import java.io.OutputStream; +import java.nio.ByteBuffer; +import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import com.tom_roush.pdfbox.util.Charsets; import com.tom_roush.pdfbox.util.Hex; - /** * A PDF Name object. * @@ -33,12 +37,12 @@ public final class COSName extends COSBase implements Comparable { // using ConcurrentHashMap because this can be accessed by multiple threads - private static final Map nameMap = new ConcurrentHashMap( - 8192); + private static final Map nameMap = new ConcurrentHashMap( + 8192); // all common COSName values are stored in this HashMap // they are already defined as static constants and don't need to be synchronized - private static final Map commonNameMap = new HashMap(768); + private static final Map commonNameMap = new HashMap(768); // // IMPORTANT: this list is *alphabetized* and does not need any JavaDoc @@ -51,12 +55,15 @@ public final class COSName extends COSBase implements Comparable public static final COSName AC = new COSName("AC"); public static final COSName ACRO_FORM = new COSName("AcroForm"); public static final COSName ACTUAL_TEXT = new COSName("ActualText"); + public static final COSName ADBE = new COSName("ADBE"); public static final COSName ADBE_PKCS7_DETACHED = new COSName("adbe.pkcs7.detached"); public static final COSName ADBE_PKCS7_SHA1 = new COSName("adbe.pkcs7.sha1"); public static final COSName ADBE_X509_RSA_SHA1 = new COSName("adbe.x509.rsa_sha1"); public static final COSName ADOBE_PPKLITE = new COSName("Adobe.PPKLite"); public static final COSName AESV2 = new COSName("AESV2"); public static final COSName AESV3 = new COSName("AESV3"); + public static final COSName AF = new COSName("AF"); + public static final COSName AF_RELATIONSHIP = new COSName("AFRelationship"); public static final COSName AFTER = new COSName("After"); public static final COSName AI_META_DATA = new COSName("AIMetaData"); public static final COSName AIS = new COSName("AIS"); @@ -90,6 +97,7 @@ public final class COSName extends COSBase implements Comparable public static final COSName BASE_ENCODING = new COSName("BaseEncoding"); public static final COSName BASE_FONT = new COSName("BaseFont"); public static final COSName BASE_STATE = new COSName("BaseState"); + public static final COSName BASE_VERSION = new COSName("BaseVersion"); public static final COSName BBOX = new COSName("BBox"); public static final COSName BC = new COSName("BC"); public static final COSName BE = new COSName("BE"); @@ -125,6 +133,7 @@ public final class COSName extends COSBase implements Comparable public static final COSName CCITTFAX_DECODE_ABBREVIATION = new COSName("CCF"); public static final COSName CENTER_WINDOW = new COSName("CenterWindow"); public static final COSName CERT = new COSName("Cert"); + public static final COSName CERTS = new COSName("Certs"); public static final COSName CF = new COSName("CF"); public static final COSName CFM = new COSName("CFM"); //** Acro form field type for choice fields. @@ -139,6 +148,7 @@ public final class COSName extends COSBase implements Comparable public static final COSName CID_SET = new COSName("CIDSet"); public static final COSName CIDSYSTEMINFO = new COSName("CIDSystemInfo"); public static final COSName CL = new COSName("CL"); + public static final COSName CLASS_MAP = new COSName("ClassMap"); public static final COSName CLR_F = new COSName("ClrF"); public static final COSName CLR_FF = new COSName("ClrFf"); public static final COSName CMAP = new COSName("CMap"); @@ -167,6 +177,8 @@ public final class COSName extends COSBase implements Comparable public static final COSName CP = new COSName("CP"); public static final COSName CREATION_DATE = new COSName("CreationDate"); public static final COSName CREATOR = new COSName("Creator"); + public static final COSName CRL = new COSName("CRL"); + public static final COSName CRLS = new COSName("CRLs"); public static final COSName CROP_BOX = new COSName("CropBox"); public static final COSName CRYPT = new COSName("Crypt"); public static final COSName CS = new COSName("CS"); @@ -217,6 +229,7 @@ public final class COSName extends COSBase implements Comparable public static final COSName DP = new COSName("DP"); public static final COSName DR = new COSName("DR"); public static final COSName DS = new COSName("DS"); + public static final COSName DSS = new COSName("DSS"); public static final COSName DUPLEX = new COSName("Duplex"); public static final COSName DUR = new COSName("Dur"); public static final COSName DV = new COSName("DV"); @@ -238,9 +251,13 @@ public final class COSName extends COSBase implements Comparable public static final COSName ENCODING_ETEN_B5_V = new COSName("ETen-B5-V"); public static final COSName ENCRYPT = new COSName("Encrypt"); public static final COSName ENCRYPT_META_DATA = new COSName("EncryptMetadata"); + public static final COSName ENCRYPTED_PAYLOAD = new COSName("EncryptedPayload"); public static final COSName END_OF_LINE = new COSName("EndOfLine"); public static final COSName ENTRUST_PPKEF = new COSName("Entrust.PPKEF"); public static final COSName EXCLUSION = new COSName("Exclusion"); + public static final COSName EXTENSIONS = new COSName("Extensions"); + public static final COSName EXTENSION_LEVEL = new COSName("ExtensionLevel"); + public static final COSName EX_DATA = new COSName("ExData"); public static final COSName EXT_G_STATE = new COSName("ExtGState"); public static final COSName EXTEND = new COSName("Extend"); public static final COSName EXTENDS = new COSName("Extends"); @@ -345,6 +362,7 @@ public final class COSName extends COSBase implements Comparable public static final COSName LENGTH2 = new COSName("Length2"); public static final COSName LIGHTEN = new COSName("Lighten"); public static final COSName LIMITS = new COSName("Limits"); + public static final COSName LINK = getPDFName("Link"); public static final COSName LJ = new COSName("LJ"); public static final COSName LL = new COSName("LL"); public static final COSName LLE = new COSName("LLE"); @@ -366,6 +384,7 @@ public final class COSName extends COSBase implements Comparable public static final COSName MAX_LEN = new COSName("MaxLen"); public static final COSName MAX_WIDTH = new COSName("MaxWidth"); public static final COSName MCID = new COSName("MCID"); + public static final COSName MCR = getPDFName("MCR"); public static final COSName MDP = new COSName("MDP"); public static final COSName MEDIA_BOX = new COSName("MediaBox"); public static final COSName MEASURE = new COSName("Measure"); @@ -394,12 +413,15 @@ public final class COSName extends COSBase implements Comparable // O public static final COSName O = new COSName("O"); public static final COSName OBJ = new COSName("Obj"); + public static final COSName OBJR = new COSName("OBJR"); public static final COSName OBJ_STM = new COSName("ObjStm"); public static final COSName OC = new COSName("OC"); public static final COSName OCG = new COSName("OCG"); public static final COSName OCGS = new COSName("OCGs"); public static final COSName OCMD = new COSName("OCMD"); public static final COSName OCPROPERTIES = new COSName("OCProperties"); + public static final COSName OCSP = new COSName("OCSP"); + public static final COSName OCSPS = new COSName("OCSPs"); public static final COSName OE = new COSName("OE"); public static final COSName OID = new COSName("OID"); @@ -426,7 +448,7 @@ public final class COSName extends COSBase implements Comparable public static final COSName OUTLINES = new COSName("Outlines"); public static final COSName OUTPUT_CONDITION = new COSName("OutputCondition"); public static final COSName OUTPUT_CONDITION_IDENTIFIER = new COSName( - "OutputConditionIdentifier"); + "OutputConditionIdentifier"); public static final COSName OUTPUT_INTENT = new COSName("OutputIntent"); public static final COSName OUTPUT_INTENTS = new COSName("OutputIntents"); public static final COSName OVERLAY = new COSName("Overlay"); @@ -452,6 +474,7 @@ public final class COSName extends COSBase implements Comparable public static final COSName PERCEPTUAL = new COSName("Perceptual"); public static final COSName PIECE_INFO = new COSName("PieceInfo"); public static final COSName PG = new COSName("Pg"); + public static final COSName POPUP = new COSName("Popup"); public static final COSName PRE_RELEASE = new COSName("PreRelease"); public static final COSName PREDICTOR = new COSName("Predictor"); public static final COSName PREV = new COSName("Prev"); @@ -512,6 +535,7 @@ public final class COSName extends COSBase implements Comparable public static final COSName SIZE = new COSName("Size"); public static final COSName SM = new COSName("SM"); public static final COSName SMASK = new COSName("SMask"); + public static final COSName SMASK_IN_DATA = new COSName("SMaskInData"); public static final COSName SOFT_LIGHT = new COSName("SoftLight"); public static final COSName SORT = new COSName("Sort"); public static final COSName SOUND = new COSName("Sound"); @@ -548,6 +572,7 @@ public final class COSName extends COSBase implements Comparable public static final COSName TARGET = new COSName("Target"); public static final COSName TEMPLATES = new COSName("Templates"); public static final COSName THREADS = new COSName("Threads"); + public static final COSName THREE_DD = new COSName("3DD"); public static final COSName THUMB = new COSName("Thumb"); public static final COSName TI = new COSName("TI"); public static final COSName TILING_TYPE = new COSName("TilingType"); @@ -597,6 +622,7 @@ public final class COSName extends COSBase implements Comparable public static final COSName VIEWER_PREFERENCES = new COSName("ViewerPreferences"); public static final COSName VOLUME = new COSName("Volume"); public static final COSName VP = new COSName("VP"); + public static final COSName VRI = new COSName("VRI"); // W public static final COSName W = new COSName("W"); public static final COSName W2 = new COSName("W2"); @@ -620,100 +646,180 @@ public final class COSName extends COSBase implements Comparable public static final COSName ZA_DB = new COSName("ZaDb"); // fields - private final String name; - private final int hashCode; /** - * This will get a COSName object with that name. + *

    Per PDF 32000-1:2008 §7.3.5: Beginning with PDF 1.2 a name object is an atomic symbol + * uniquely defined by a sequence of any characters (8-bit values) except null + * (character code 0).

    + */ + private final byte[] nameBytes; + + /** + * Returns a {@code COSName} whose byte sequence is the UTF-8 encoding of {@code aName}. * - * @param aName The name of the object. + *

    This is the standard factory for names defined in Java source code (e.g. the static + * constants above). All well-formed PDF names defined by the spec are ASCII, so the UTF-8 + * encoding is a transparent identity transform for those cases.

    * - * @return A COSName with the specified name. + * @param aName the name string; must not be {@code null} + * @return a canonicalised {@code COSName} instance */ public static COSName getPDFName(String aName) { - COSName name = null; - if (aName != null) + return getPDFName(aName.getBytes(Charsets.UTF_8)); + } + + /** + * Returns a {@code COSName} whose byte sequence is exactly {@code bytes}. + * + *

    This is the preferred factory when constructing a name directly from a PDF byte stream + * (i.e. after the parser has stripped the leading {@code /} and expanded all {@code #XX} + * escape sequences). Using this method preserves the spec-correct, byte-level identity of the + * name even when the bytes are not valid UTF-8.

    + * + *

    Null bytes (0x00) are rejected; the spec explicitly excludes them.

    + * + * @param bytes the raw decoded byte sequence; must not be {@code null} and must not contain 0x00 + * @return a canonicalised {@code COSName} instance + * @throws IllegalArgumentException if {@code bytes} contains a null byte + */ + public static COSName getPDFName(byte[] bytes) + { + if (bytes == null) + { + return null; + } + + // Wrap for lookup only to avoid unnecessary copying of the byte array for the key. + ByteBuffer lookupKey = ByteBuffer.wrap(bytes); + + // Is it a common COSName ?? + COSName name = commonNameMap.get(lookupKey); + if (name == null) { - // Is it a common COSName ?? - name = commonNameMap.get(aName); + // It seems to be a document specific COSName + name = nameMap.get(lookupKey); if (name == null) { - // It seems to be a document specific COSName - name = nameMap.get(aName); - if (name == null) - { - // name is added to the synchronized map in the constructor - name = new COSName(aName, false); - } + // name is added to the synchronized map in the constructor + name = new COSName(bytes, false); } } + return name; } /** - * Private constructor. This will limit the number of COSName objects. that are created. + * Private constructor. This will limit the number of COSName objects that are created. * - * @param aName The name of the COSName object. + * @param storedBytes The name of the COSName object. * @param staticValue Indicates if the COSName object is static so that it can be stored in the HashMap without * synchronizing. */ - private COSName(String aName, boolean staticValue) + private COSName(byte[] storedBytes, boolean staticValue) { - name = aName; - hashCode = name.hashCode(); + this.nameBytes = storedBytes; + ByteBuffer storedKey = ByteBuffer.wrap(storedBytes); if (staticValue) { - commonNameMap.put(aName, this); + commonNameMap.put(storedKey, this); } else { - nameMap.put(aName, this); + nameMap.put(storedKey, this); } } /** - * Private constructor. This will limit the number of COSName objects. that are created. + * Private constructor. This will limit the number of COSName objects that are created. * * @param aName The name of the COSName object. */ private COSName(String aName) { - this(aName, true); + this(aName.getBytes(Charsets.UTF_8), true); + } + + /** + * Returns the raw byte sequence that defines this name. + * + *

    This is the atomic content/identity of the name. Prefer this over + * {@link #getName()} whenever you need to write name bytes to an output stream, compare names + * parsed from a PDF, or otherwise operate at the byte level.

    + * + * @return a defensive copy of the internal byte array; never {@code null} + */ + public byte[] getBytes() + { + return Arrays.copyOf(nameBytes, nameBytes.length); } /** - * This will get the name of this COSName object. + * Returns the name decoded as a UTF-8 {@code String}. + * + *

    This method exists primarily for backward compatibility and for cases where the + * readable value needs to be stored.

    + * + *

    Per PDF 32000-1:2008 §7.3.5, ... However, occasionally the need arises to treat a name object + * as text, such as one that represents a font ...

    + * + *

    ... In such situations, the sequence of bytes (after expansion of NUMBER SIGN sequences, if any) + * should be interpreted according to UTF-8...

    + * + *

    Use {@link #getBytes()} when byte-level fidelity is required.

    * * @return The name of the object. */ public String getName() { - return name; + String utf8String = new String(nameBytes, Charsets.UTF_8); + + //check for lossy decoding, which can happen if the name contains + // bytes that are not valid UTF-8 + if (utf8String.indexOf('\uFFFD') >= 0) + { + // fall back to ISO-8859-1, which is a single-byte encoding that can decode any + // byte sequence without loss + return new String(nameBytes, Charsets.ISO_8859_1); + } + return utf8String; } @Override public String toString() { - return "COSName{" + name + "}"; + return "COSName{" + getName() + "}"; } @Override public boolean equals(Object object) { - return object instanceof COSName && name.equals(((COSName) object).name); + return object instanceof COSName && Arrays.equals(nameBytes, ((COSName) object).nameBytes); } @Override public int hashCode() { - return hashCode; + return Arrays.hashCode(nameBytes); } @Override public int compareTo(COSName other) { - return name.compareTo(other.name); + if (this == other) + { + return 0; + } + int len = Math.min(nameBytes.length, other.nameBytes.length); + for (int i = 0; i < len; i++) + { + int diff = (nameBytes[i] & 0xFF) - (other.nameBytes[i] & 0xFF); + if (diff != 0) + { + return diff; + } + } + return nameBytes.length - other.nameBytes.length; } /** @@ -722,7 +828,7 @@ public int compareTo(COSName other) */ public boolean isEmpty() { - return name.isEmpty(); + return nameBytes.length == 0; } @Override @@ -740,23 +846,23 @@ public Object accept(ICOSVisitor visitor) throws IOException public void writePDF(OutputStream output) throws IOException { output.write('/'); - byte[] bytes = getName().getBytes(Charsets.UTF_8); + byte[] bytes = getBytes(); for (byte b : bytes) { int current = b & 0xFF; // be more restrictive than the PDF spec, "Name Objects", see PDFBOX-2073 if (current >= 'A' && current <= 'Z' || - current >= 'a' && current <= 'z' || - current >= '0' && current <= '9' || - current == '+' || - current == '-' || - current == '_' || - current == '@' || - current == '*' || - current == '$' || - current == ';' || - current == '.') + current >= 'a' && current <= 'z' || + current >= '0' && current <= '9' || + current == '+' || + current == '-' || + current == '_' || + current == '@' || + current == '*' || + current == '$' || + current == ';' || + current == '.') { output.write(current); } diff --git a/library/src/main/java/com/tom_roush/pdfbox/cos/COSNumber.java b/library/src/main/java/com/tom_roush/pdfbox/cos/COSNumber.java index abbfc5773..189eaa834 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/cos/COSNumber.java +++ b/library/src/main/java/com/tom_roush/pdfbox/cos/COSNumber.java @@ -17,7 +17,6 @@ package com.tom_roush.pdfbox.cos; import java.io.IOException; - /** * This class represents an abstract number in a PDF document. * @@ -113,14 +112,14 @@ else if (digit == '-' || digit == '.') { // check if the given string could be a number at all String numberString = number.startsWith("+") || number.startsWith("-") - ? number.substring(1) : number; - if (!numberString.matches("[0-9]*")) + ? number.substring(1) : number; + if (!numberString.matches("\\d*")) { throw new IOException("Not a number: " + number); } // return a limited COSInteger value which is marked as invalid return number.startsWith("-") ? COSInteger.OUT_OF_RANGE_MIN - : COSInteger.OUT_OF_RANGE_MAX; + : COSInteger.OUT_OF_RANGE_MAX; } } diff --git a/library/src/main/java/com/tom_roush/pdfbox/cos/COSObject.java b/library/src/main/java/com/tom_roush/pdfbox/cos/COSObject.java index 2b3c5f519..f54584625 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/cos/COSObject.java +++ b/library/src/main/java/com/tom_roush/pdfbox/cos/COSObject.java @@ -17,7 +17,6 @@ package com.tom_roush.pdfbox.cos; import java.io.IOException; - /** * This class represents a PDF object. * @@ -51,7 +50,11 @@ public COSObject( COSBase object ) throws IOException * @param key The key to the value that we are searching for. * * @return The pdf object that matches the key. + * + * @deprecated This will be removed in 3.0. Call {@link #getObject()} to find out if it has the + * correct type and then call {@link #getDictionaryObject(com.tom_roush.pdfbox.cos.COSName)}. */ + @Deprecated public COSBase getDictionaryObject( COSName key ) { COSBase retval =null; @@ -68,7 +71,11 @@ public COSBase getDictionaryObject( COSName key ) * @param key The key to the value that we are searching for. * * @return The pdf object that matches the key. + * + * @deprecated This will be removed in 3.0. Call {@link #getObject()} to find out if it has the + * correct type and then call {@link #getDictionaryObject(com.tom_roush.pdfbox.cos.COSName)}. */ + @Deprecated public COSBase getItem( COSName key ) { COSBase retval =null; diff --git a/library/src/main/java/com/tom_roush/pdfbox/cos/COSString.java b/library/src/main/java/com/tom_roush/pdfbox/cos/COSString.java index 36a4b07dd..34d47f713 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/cos/COSString.java +++ b/library/src/main/java/com/tom_roush/pdfbox/cos/COSString.java @@ -24,7 +24,6 @@ import com.tom_roush.pdfbox.util.Charsets; import com.tom_roush.pdfbox.util.Hex; - /** * A string object, which may be a text string, a PDFDocEncoded string, ASCII string, or byte string. * @@ -45,12 +44,13 @@ */ public final class COSString extends COSBase { + private byte[] bytes; private boolean forceHexForm; // legacy behaviour for old PDFParser public static final boolean FORCE_PARSING = - Boolean.getBoolean("com.tom_roush.pdfbox.forceParsing"); + Boolean.getBoolean("com.tom_roush.pdfbox.forceParsing"); /** * Creates a new PDF string from a byte array. This method can be used to read a string from @@ -106,36 +106,60 @@ public COSString(String text) */ public static COSString parseHex(String hex) throws IOException { - ByteArrayOutputStream bytes = new ByteArrayOutputStream(); - StringBuilder hexBuffer = new StringBuilder(hex.trim()); - - // if odd number then the last hex digit is assumed to be 0 - if (hexBuffer.length() % 2 != 0) + // skip leading and trailing whitespace + int end = hex.length(); + while (end > 0 && Character.isWhitespace(hex.charAt(end - 1))) + { + end--; + } + int start = 0; + while (start < end && Character.isWhitespace(hex.charAt(start))) { - hexBuffer.append('0'); + start++; } - int length = hexBuffer.length(); + int length = end - start; + ByteArrayOutputStream bytes = new ByteArrayOutputStream((length + 1) / 2); + + boolean isLengthUneven = length % 2 != 0; + if (isLengthUneven) + { + length--; + } for (int i = 0; i < length; i += 2) { - try + int value = 16 * Hex.getHexValue(hex.charAt(i)) + Hex.getHexValue(hex.charAt(i + 1)); + if (value >= 0) + { + bytes.write(value); + } + else if (FORCE_PARSING) { - bytes.write(Integer.parseInt(hexBuffer.substring(i, i + 2), 16)); + Log.w("PdfBox-Android", "Encountered a malformed hex string"); + bytes.write('?'); // todo: what does Acrobat do? Any example PDFs? } - catch (NumberFormatException e) + else { - if (FORCE_PARSING) - { - Log.w("PdfBox-Android", "Encountered a malformed hex string"); - bytes.write('?'); // todo: what does Acrobat do? Any example PDFs? - } - else - { - throw new IOException("Invalid hex string: " + hex, e); - } + throw new IOException("Invalid hex string: " + hex); + } + } + if (isLengthUneven) + { + int value = 16 * Hex.getHexValue(hex.charAt(length)); + if (value >= 0) + { + bytes.write(value); + } + else if (FORCE_PARSING) + { + Log.w("PdfBox-Android", "Encountered a malformed hex string"); + bytes.write('?'); // todo: what does Acrobat do? Any example PDFs? + } + else + { + throw new IOException("Invalid hex string: " + hex); } } - return new COSString(bytes.toByteArray()); } @@ -246,7 +270,7 @@ public boolean equals(Object obj) { COSString strObj = (COSString) obj; return getString().equals(strObj.getString()) && - forceHexForm == strObj.forceHexForm; + forceHexForm == strObj.forceHexForm; } return false; } diff --git a/library/src/main/java/com/tom_roush/pdfbox/cos/PDFDocEncoding.java b/library/src/main/java/com/tom_roush/pdfbox/cos/PDFDocEncoding.java index 2aaec0baf..98ea27faa 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/cos/PDFDocEncoding.java +++ b/library/src/main/java/com/tom_roush/pdfbox/cos/PDFDocEncoding.java @@ -20,7 +20,6 @@ import java.io.ByteArrayOutputStream; import java.util.HashMap; import java.util.Map; - /** * The "PDFDocEncoding" encoding. Note that this is *not* a Type 1 font encoding, it is used only * within PDF "text strings". @@ -120,7 +119,7 @@ private static void set(int code, char unicode) */ public static String toString(byte[] bytes) { - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(bytes.length); for (byte b : bytes) { if ((b & 0xff) >= CODE_TO_UNI.length) @@ -140,7 +139,7 @@ public static String toString(byte[] bytes) */ public static byte[] getBytes(String text) { - ByteArrayOutputStream out = new ByteArrayOutputStream(); + ByteArrayOutputStream out = new ByteArrayOutputStream(text.length()); for (char c : text.toCharArray()) { Integer code = UNI_TO_CODE.get(c); diff --git a/library/src/main/java/com/tom_roush/pdfbox/filter/ASCIIHexFilter.java b/library/src/main/java/com/tom_roush/pdfbox/filter/ASCIIHexFilter.java index 913e52655..c05f7e4f6 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/filter/ASCIIHexFilter.java +++ b/library/src/main/java/com/tom_roush/pdfbox/filter/ASCIIHexFilter.java @@ -24,7 +24,6 @@ import com.tom_roush.pdfbox.cos.COSDictionary; import com.tom_roush.pdfbox.util.Hex; - /** * Decodes data encoded in an ASCII hexadecimal form, reproducing the original binary data. * @@ -32,38 +31,39 @@ */ final class ASCIIHexFilter extends Filter { + private static final int[] REVERSE_HEX = { - /* 0 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - /* 10 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - /* 20 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - /* 30 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - /* 40 */ -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, - /* 50 */ 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, - /* 60 */ -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, - /* 70 */ 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, - /* 80 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - /* 90 */ -1, -1, -1, -1, -1, -1, -1, 10, 11, 12, - /* 100 */ 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, - /* 110 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - /* 120 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - /* 130 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - /* 140 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - /* 150 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - /* 160 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - /* 170 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - /* 180 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - /* 190 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - /* 200 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - /* 210 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - /* 220 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - /* 230 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - /* 240 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - /* 250 */ -1, -1, -1, -1, -1, -1 + /* 0 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + /* 10 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + /* 20 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + /* 30 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + /* 40 */ -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, + /* 50 */ 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, + /* 60 */ -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, + /* 70 */ 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, + /* 80 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + /* 90 */ -1, -1, -1, -1, -1, -1, -1, 10, 11, 12, + /* 100 */ 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, + /* 110 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + /* 120 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + /* 130 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + /* 140 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + /* 150 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + /* 160 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + /* 170 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + /* 180 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + /* 190 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + /* 200 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + /* 210 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + /* 220 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + /* 230 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + /* 240 */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + /* 250 */ -1, -1, -1, -1, -1, -1 }; @Override public DecodeResult decode(InputStream encoded, OutputStream decoded, - COSDictionary parameters, int index) throws IOException + COSDictionary parameters, int index) throws IOException { int value, firstByte, secondByte; while ((firstByte = encoded.read()) != -1) @@ -109,12 +109,23 @@ public DecodeResult decode(InputStream encoded, OutputStream decoded, // 12 0x0C Form feed (FF) // 13 0x0D Carriage return (CR) // 32 0x20 Space (SP) - private boolean isWhitespace(int c) + private static boolean isWhitespace(int c) { - return c == 0 || c == 9 || c == 10 || c == 12 || c == 13 || c == 32; + switch (c) + { + case 0: + case 9: + case 10: + case 12: + case 13: + case 32: + return true; + default: + return false; + } } - private boolean isEOD(int c) + private static boolean isEOD(int c) { return c == '>'; } diff --git a/library/src/main/java/com/tom_roush/pdfbox/filter/CCITTFaxDecoderStream.java b/library/src/main/java/com/tom_roush/pdfbox/filter/CCITTFaxDecoderStream.java index 430a838c5..31adcde45 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/filter/CCITTFaxDecoderStream.java +++ b/library/src/main/java/com/tom_roush/pdfbox/filter/CCITTFaxDecoderStream.java @@ -35,7 +35,6 @@ import java.io.IOException; import java.io.InputStream; import java.util.Arrays; - /** * CCITT Modified Huffman RLE, Group 3 (T4) and Group 4 (T6) fax compression. * @@ -86,8 +85,8 @@ final class CCITTFaxDecoderStream extends FilterInputStream { * @param options CCITT T.4 or T.6 options. * @param byteAligned enable byte alignment used in PDF files (EncodedByteAlign). */ - public CCITTFaxDecoderStream(final InputStream stream, final int columns, final int type, - final long options, final boolean byteAligned) { + CCITTFaxDecoderStream(final InputStream stream, final int columns, final int type, + final long options, final boolean byteAligned) { super(stream); this.columns = columns; @@ -591,148 +590,148 @@ void fill(final int depth, final int path, final Node node) throws IOException { } static final short[][] BLACK_CODES = { - { // 2 bits - 0x2, 0x3, - }, - { // 3 bits - 0x2, 0x3, - }, - { // 4 bits - 0x2, 0x3, - }, - { // 5 bits - 0x3, - }, - { // 6 bits - 0x4, 0x5, - }, - { // 7 bits - 0x4, 0x5, 0x7, - }, - { // 8 bits - 0x4, 0x7, - }, - { // 9 bits - 0x18, - }, - { // 10 bits - 0x17, 0x18, 0x37, 0x8, 0xf, - }, - { // 11 bits - 0x17, 0x18, 0x28, 0x37, 0x67, 0x68, 0x6c, 0x8, 0xc, 0xd, - }, - { // 12 bits - 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x1c, 0x1d, 0x1e, 0x1f, 0x24, 0x27, 0x28, 0x2b, 0x2c, 0x33, - 0x34, 0x35, 0x37, 0x38, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x64, 0x65, - 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xd2, 0xd3, - 0xd4, 0xd5, 0xd6, 0xd7, 0xda, 0xdb, - }, - { // 13 bits - 0x4a, 0x4b, 0x4c, 0x4d, 0x52, 0x53, 0x54, 0x55, 0x5a, 0x5b, 0x64, 0x65, 0x6c, 0x6d, 0x72, 0x73, - 0x74, 0x75, 0x76, 0x77, - } + { // 2 bits + 0x2, 0x3, + }, + { // 3 bits + 0x2, 0x3, + }, + { // 4 bits + 0x2, 0x3, + }, + { // 5 bits + 0x3, + }, + { // 6 bits + 0x4, 0x5, + }, + { // 7 bits + 0x4, 0x5, 0x7, + }, + { // 8 bits + 0x4, 0x7, + }, + { // 9 bits + 0x18, + }, + { // 10 bits + 0x17, 0x18, 0x37, 0x8, 0xf, + }, + { // 11 bits + 0x17, 0x18, 0x28, 0x37, 0x67, 0x68, 0x6c, 0x8, 0xc, 0xd, + }, + { // 12 bits + 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x1c, 0x1d, 0x1e, 0x1f, 0x24, 0x27, 0x28, 0x2b, 0x2c, 0x33, + 0x34, 0x35, 0x37, 0x38, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x64, 0x65, + 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xd2, 0xd3, + 0xd4, 0xd5, 0xd6, 0xd7, 0xda, 0xdb, + }, + { // 13 bits + 0x4a, 0x4b, 0x4c, 0x4d, 0x52, 0x53, 0x54, 0x55, 0x5a, 0x5b, 0x64, 0x65, 0x6c, 0x6d, 0x72, 0x73, + 0x74, 0x75, 0x76, 0x77, + } }; static final short[][] BLACK_RUN_LENGTHS = { - { // 2 bits - 3, 2, - }, - { // 3 bits - 1, 4, - }, - { // 4 bits - 6, 5, - }, - { // 5 bits - 7, - }, - { // 6 bits - 9, 8, - }, - { // 7 bits - 10, 11, 12, - }, - { // 8 bits - 13, 14, - }, - { // 9 bits - 15, - }, - { // 10 bits - 16, 17, 0, 18, 64, - }, - { // 11 bits - 24, 25, 23, 22, 19, 20, 21, 1792, 1856, 1920, - }, - { // 12 bits - 1984, 2048, 2112, 2176, 2240, 2304, 2368, 2432, 2496, 2560, 52, 55, 56, 59, 60, 320, 384, 448, 53, - 54, 50, 51, 44, 45, 46, 47, 57, 58, 61, 256, 48, 49, 62, 63, 30, 31, 32, 33, 40, 41, 128, 192, 26, - 27, 28, 29, 34, 35, 36, 37, 38, 39, 42, 43, - }, - { // 13 bits - 640, 704, 768, 832, 1280, 1344, 1408, 1472, 1536, 1600, 1664, 1728, 512, 576, 896, 960, 1024, 1088, - 1152, 1216, - } + { // 2 bits + 3, 2, + }, + { // 3 bits + 1, 4, + }, + { // 4 bits + 6, 5, + }, + { // 5 bits + 7, + }, + { // 6 bits + 9, 8, + }, + { // 7 bits + 10, 11, 12, + }, + { // 8 bits + 13, 14, + }, + { // 9 bits + 15, + }, + { // 10 bits + 16, 17, 0, 18, 64, + }, + { // 11 bits + 24, 25, 23, 22, 19, 20, 21, 1792, 1856, 1920, + }, + { // 12 bits + 1984, 2048, 2112, 2176, 2240, 2304, 2368, 2432, 2496, 2560, 52, 55, 56, 59, 60, 320, 384, 448, 53, + 54, 50, 51, 44, 45, 46, 47, 57, 58, 61, 256, 48, 49, 62, 63, 30, 31, 32, 33, 40, 41, 128, 192, 26, + 27, 28, 29, 34, 35, 36, 37, 38, 39, 42, 43, + }, + { // 13 bits + 640, 704, 768, 832, 1280, 1344, 1408, 1472, 1536, 1600, 1664, 1728, 512, 576, 896, 960, 1024, 1088, + 1152, 1216, + } }; public static final short[][] WHITE_CODES = { - { // 4 bits - 0x7, 0x8, 0xb, 0xc, 0xe, 0xf, - }, - { // 5 bits - 0x12, 0x13, 0x14, 0x1b, 0x7, 0x8, - }, - { // 6 bits - 0x17, 0x18, 0x2a, 0x2b, 0x3, 0x34, 0x35, 0x7, 0x8, - }, - { // 7 bits - 0x13, 0x17, 0x18, 0x24, 0x27, 0x28, 0x2b, 0x3, 0x37, 0x4, 0x8, 0xc, - }, - { // 8 bits - 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x1a, 0x1b, 0x2, 0x24, 0x25, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, - 0x3, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x4, 0x4a, 0x4b, 0x5, 0x52, 0x53, 0x54, 0x55, 0x58, 0x59, - 0x5a, 0x5b, 0x64, 0x65, 0x67, 0x68, 0xa, 0xb, - }, - { // 9 bits - 0x98, 0x99, 0x9a, 0x9b, 0xcc, 0xcd, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, - }, - { // 10 bits - }, - { // 11 bits - 0x8, 0xc, 0xd, - }, - { // 12 bits - 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x1c, 0x1d, 0x1e, 0x1f, - } + { // 4 bits + 0x7, 0x8, 0xb, 0xc, 0xe, 0xf, + }, + { // 5 bits + 0x12, 0x13, 0x14, 0x1b, 0x7, 0x8, + }, + { // 6 bits + 0x17, 0x18, 0x2a, 0x2b, 0x3, 0x34, 0x35, 0x7, 0x8, + }, + { // 7 bits + 0x13, 0x17, 0x18, 0x24, 0x27, 0x28, 0x2b, 0x3, 0x37, 0x4, 0x8, 0xc, + }, + { // 8 bits + 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x1a, 0x1b, 0x2, 0x24, 0x25, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, + 0x3, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x4, 0x4a, 0x4b, 0x5, 0x52, 0x53, 0x54, 0x55, 0x58, 0x59, + 0x5a, 0x5b, 0x64, 0x65, 0x67, 0x68, 0xa, 0xb, + }, + { // 9 bits + 0x98, 0x99, 0x9a, 0x9b, 0xcc, 0xcd, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, + }, + { // 10 bits + }, + { // 11 bits + 0x8, 0xc, 0xd, + }, + { // 12 bits + 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x1c, 0x1d, 0x1e, 0x1f, + } }; public static final short[][] WHITE_RUN_LENGTHS = { - { // 4 bits - 2, 3, 4, 5, 6, 7, - }, - { // 5 bits - 128, 8, 9, 64, 10, 11, - }, - { // 6 bits - 192, 1664, 16, 17, 13, 14, 15, 1, 12, - }, - { // 7 bits - 26, 21, 28, 27, 18, 24, 25, 22, 256, 23, 20, 19, - }, - { // 8 bits - 33, 34, 35, 36, 37, 38, 31, 32, 29, 53, 54, 39, 40, 41, 42, 43, 44, 30, 61, 62, 63, 0, 320, 384, 45, - 59, 60, 46, 49, 50, 51, 52, 55, 56, 57, 58, 448, 512, 640, 576, 47, 48, - }, - { // 9 bits - 1472, 1536, 1600, 1728, 704, 768, 832, 896, 960, 1024, 1088, 1152, 1216, 1280, 1344, 1408, - }, - { // 10 bits - }, - { // 11 bits - 1792, 1856, 1920, - }, - { // 12 bits - 1984, 2048, 2112, 2176, 2240, 2304, 2368, 2432, 2496, 2560, - } + { // 4 bits + 2, 3, 4, 5, 6, 7, + }, + { // 5 bits + 128, 8, 9, 64, 10, 11, + }, + { // 6 bits + 192, 1664, 16, 17, 13, 14, 15, 1, 12, + }, + { // 7 bits + 26, 21, 28, 27, 18, 24, 25, 22, 256, 23, 20, 19, + }, + { // 8 bits + 33, 34, 35, 36, 37, 38, 31, 32, 29, 53, 54, 39, 40, 41, 42, 43, 44, 30, 61, 62, 63, 0, 320, 384, 45, + 59, 60, 46, 49, 50, 51, 52, 55, 56, 57, 58, 448, 512, 640, 576, 47, 48, + }, + { // 9 bits + 1472, 1536, 1600, 1728, 704, 768, 832, 896, 960, 1024, 1088, 1152, 1216, 1280, 1344, 1408, + }, + { // 10 bits + }, + { // 11 bits + 1792, 1856, 1920, + }, + { // 12 bits + 1984, 2048, 2112, 2176, 2240, 2304, 2368, 2432, 2496, 2560, + } }; final static Node EOL; diff --git a/library/src/main/java/com/tom_roush/pdfbox/filter/CCITTFaxEncoderStream.java b/library/src/main/java/com/tom_roush/pdfbox/filter/CCITTFaxEncoderStream.java index 06d250f53..00844c004 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/filter/CCITTFaxEncoderStream.java +++ b/library/src/main/java/com/tom_roush/pdfbox/filter/CCITTFaxEncoderStream.java @@ -29,7 +29,6 @@ import java.io.IOException; import java.io.OutputStream; - /** * CCITT Modified Group 4 (T6) fax compression. * @@ -46,7 +45,7 @@ final class CCITTFaxEncoderStream extends OutputStream { private int currentBufferLength = 0; - private final byte[] inputBuffer; + private byte[] inputBuffer; private final int inputBufferLength; private final int columns; private final int rows; @@ -93,6 +92,9 @@ public void flush() throws IOException { @Override public void close() throws IOException { + changesCurrentRow = null; + changesReferenceRow = null; + inputBuffer = null; stream.close(); } diff --git a/library/src/main/java/com/tom_roush/pdfbox/filter/CCITTFaxFilter.java b/library/src/main/java/com/tom_roush/pdfbox/filter/CCITTFaxFilter.java index ca52e425f..cedfb1bcf 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/filter/CCITTFaxFilter.java +++ b/library/src/main/java/com/tom_roush/pdfbox/filter/CCITTFaxFilter.java @@ -24,7 +24,6 @@ import com.tom_roush.pdfbox.cos.COSDictionary; import com.tom_roush.pdfbox.cos.COSName; import com.tom_roush.pdfbox.io.IOUtils; - /** * Decodes image data that has been encoded using either Group 3 or Group 4 * CCITT facsimile (fax) encoding, and encodes image data to Group 4. @@ -37,7 +36,7 @@ final class CCITTFaxFilter extends Filter { @Override public DecodeResult decode(InputStream encoded, OutputStream decoded, - COSDictionary parameters, int index) throws IOException + COSDictionary parameters, int index) throws IOException { // get decode parameters COSDictionary decodeParms = getDecodeParams(parameters, index); @@ -60,33 +59,82 @@ public DecodeResult decode(InputStream encoded, OutputStream decoded, // decompress data int k = decodeParms.getInt(COSName.K, 0); boolean encodedByteAlign = decodeParms.getBoolean(COSName.ENCODED_BYTE_ALIGN, false); - int arraySize = (cols + 7) / 8 * rows; - // TODO possible options?? + if (cols <= 0 || rows <= 0) + { + throw new IOException("Invalid CCITT image dimensions: cols=" + cols + ", rows=" + rows); + } + + long arraySizeLong = ((long) cols + 7) / 8 * rows; + + long maxBytes = 256 * 1024 * 1024L; + String sysProp = System.getProperty(Filter.SYSPROP_CCITTFAX_MAXBYTES); + + if (sysProp != null) + { + try + { + long parsed = Long.parseLong(sysProp); + if (parsed > 0) + { + maxBytes = parsed; + } + // else ignore zero/negative values + } + catch (NumberFormatException e) + { + // ignore invalid value, keep default + } + } + + if (arraySizeLong > maxBytes) + { + throw new IOException( + "CCITT decode buffer too large (" + arraySizeLong + " bytes) for cols=" + cols + + ", rows=" + rows + "; max allowed=" + maxBytes + + "; increase " + Filter.SYSPROP_CCITTFAX_MAXBYTES + " to override" + ); + } + + int arraySize = (int) arraySizeLong; byte[] decompressed = new byte[arraySize]; CCITTFaxDecoderStream s; int type; long tiffOptions = 0; if (k == 0) { - type = TIFFExtension.COMPRESSION_CCITT_T4; // Group 3 1D - byte[] streamData = new byte[20]; - int bytesRead = encoded.read(streamData); - PushbackInputStream pushbackInputStream = new PushbackInputStream(encoded, streamData.length); - pushbackInputStream.unread(streamData, 0, bytesRead); - encoded = pushbackInputStream; - if (streamData[0] != 0 || (streamData[1] >> 4 != 1 && streamData[1] != 1)) + if (decodeParms.containsKey(COSName.END_OF_LINE)) + { + // PDFBOX-6080: respect the parameter if it exists + boolean hasEndOfLine = decodeParms.getBoolean(COSName.END_OF_LINE, false); + type = hasEndOfLine ? TIFFExtension.COMPRESSION_CCITT_T4 : TIFFExtension.COMPRESSION_CCITT_MODIFIED_HUFFMAN_RLE; + } + else { - // leading EOL (0b000000000001) not found, search further and try RLE if not - // found - type = TIFFExtension.COMPRESSION_CCITT_MODIFIED_HUFFMAN_RLE; - short b = (short) (((streamData[0] << 8) + (streamData[1] & 0xff)) >> 4); - for (int i = 12; i < bytesRead * 8; i++) + // In twelvemonkeys, this part is found in CCITTFaxDecoderStream.findCompressionType() + // needed for 015315-p8-ccitt.pdf, PDFBOX-2123-1bit.pdf, PDFBOX-2778.pdf + type = TIFFExtension.COMPRESSION_CCITT_T4; // Group 3 1D + byte[] streamData = new byte[20]; + int bytesRead = encoded.read(streamData); + if (bytesRead == -1) + { + throw new IOException("EOF while reading CCITT header"); + } + PushbackInputStream pushbackInputStream = new PushbackInputStream(encoded, streamData.length); + pushbackInputStream.unread(streamData, 0, bytesRead); + encoded = pushbackInputStream; + if (streamData[0] != 0 || (streamData[1] >> 4 != 1 && streamData[1] != 1)) { - b = (short) ((b << 1) + ((streamData[(i / 8)] >> (7 - (i % 8))) & 0x01)); - if ((b & 0xFFF) == 1) + // leading EOL (0b000000000001) not found, search further and try RLE if not found + type = TIFFExtension.COMPRESSION_CCITT_MODIFIED_HUFFMAN_RLE; + short b = (short) (((streamData[0] << 8) + (streamData[1] & 0xff)) >> 4); + for (int i = 12; i < bytesRead * 8; i++) { - type = TIFFExtension.COMPRESSION_CCITT_T4; - break; + b = (short) ((b << 1) + ((streamData[(i / 8)] >> (7 - (i % 8))) & 0x01)); + if ((b & 0xFFF) == 1) + { + type = TIFFExtension.COMPRESSION_CCITT_T4; + break; + } } } } @@ -121,7 +169,7 @@ else if (k > 0) } void readFromDecoderStream(CCITTFaxDecoderStream decoderStream, byte[] result) - throws IOException + throws IOException { int pos = 0; int read; @@ -145,12 +193,12 @@ private void invertBitmap(byte[] bufferData) @Override protected void encode(InputStream input, OutputStream encoded, COSDictionary parameters) - throws IOException + throws IOException { int cols = parameters.getInt(COSName.COLUMNS); int rows = parameters.getInt(COSName.ROWS); CCITTFaxEncoderStream ccittFaxEncoderStream = - new CCITTFaxEncoderStream(encoded, cols, rows, TIFFExtension.FILL_LEFT_TO_RIGHT); + new CCITTFaxEncoderStream(encoded, cols, rows, TIFFExtension.FILL_LEFT_TO_RIGHT); IOUtils.copy(input, ccittFaxEncoderStream); } } diff --git a/library/src/main/java/com/tom_roush/pdfbox/filter/CryptFilter.java b/library/src/main/java/com/tom_roush/pdfbox/filter/CryptFilter.java index 08123634f..798c032f0 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/filter/CryptFilter.java +++ b/library/src/main/java/com/tom_roush/pdfbox/filter/CryptFilter.java @@ -22,7 +22,6 @@ import com.tom_roush.pdfbox.cos.COSDictionary; import com.tom_roush.pdfbox.cos.COSName; - /** * Decrypts data encrypted by a security handler, reproducing the data as it was before encryption. * @author Adam Nichols @@ -31,9 +30,9 @@ final class CryptFilter extends Filter { @Override public DecodeResult decode(InputStream encoded, OutputStream decoded, - COSDictionary parameters, int index) throws IOException + COSDictionary parameters, int index) throws IOException { - COSName encryptionName = (COSName) parameters.getDictionaryObject(COSName.NAME); + COSName encryptionName = parameters.getCOSName(COSName.NAME); if(encryptionName == null || encryptionName.equals(COSName.IDENTITY)) { // currently the only supported implementation is the Identity crypt filter @@ -46,9 +45,9 @@ public DecodeResult decode(InputStream encoded, OutputStream decoded, @Override protected void encode(InputStream input, OutputStream encoded, COSDictionary parameters) - throws IOException + throws IOException { - COSName encryptionName = (COSName) parameters.getDictionaryObject(COSName.NAME); + COSName encryptionName = parameters.getCOSName(COSName.NAME); if(encryptionName == null || encryptionName.equals(COSName.IDENTITY)) { // currently the only supported implementation is the Identity crypt filter diff --git a/library/src/main/java/com/tom_roush/pdfbox/filter/DecodeResult.java b/library/src/main/java/com/tom_roush/pdfbox/filter/DecodeResult.java index 69ef3dc83..f902aea4c 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/filter/DecodeResult.java +++ b/library/src/main/java/com/tom_roush/pdfbox/filter/DecodeResult.java @@ -16,6 +16,8 @@ */ package com.tom_roush.pdfbox.filter; +import android.graphics.Bitmap; + import com.tom_roush.pdfbox.cos.COSDictionary; import com.tom_roush.pdfbox.pdmodel.graphics.color.PDJPXColorSpace; @@ -32,6 +34,7 @@ public final class DecodeResult private final COSDictionary parameters; private PDJPXColorSpace colorSpace; + private Bitmap smask; DecodeResult(COSDictionary parameters) { @@ -67,4 +70,14 @@ void setColorSpace(PDJPXColorSpace colorSpace) { this.colorSpace = colorSpace; } + void setJPXSMask(Bitmap smask) + { + this.smask = smask; + } + + public Bitmap getJPXSMask() + { + return smask; + } + } diff --git a/library/src/main/java/com/tom_roush/pdfbox/filter/Filter.java b/library/src/main/java/com/tom_roush/pdfbox/filter/Filter.java index 536b83b9f..637f264ef 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/filter/Filter.java +++ b/library/src/main/java/com/tom_roush/pdfbox/filter/Filter.java @@ -21,13 +21,13 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.Iterator; import java.util.zip.Deflater; import com.tom_roush.pdfbox.cos.COSArray; import com.tom_roush.pdfbox.cos.COSBase; import com.tom_roush.pdfbox.cos.COSDictionary; import com.tom_roush.pdfbox.cos.COSName; - /** * A filter for stream data. * @@ -36,6 +36,7 @@ */ public abstract class Filter { + /** * Compression Level System Property. Set this to a value from 0 to 9 to change the zlib deflate * compression level used to compress /Flate streams. The default value is -1 which is @@ -44,6 +45,16 @@ public abstract class Filter */ public static final String SYSPROP_DEFLATELEVEL = "com.tom_roush.pdfbox.filter.deflatelevel"; + /** + * CCITTFax decode buffer size cap System Property. Sets the maximum number of bytes that + * CCITTFaxFilter is allowed to pre-allocate for a single image decode buffer. PDF-controlled + * /Columns and /Rows values are validated against this limit before allocation to prevent + * denial-of-service via crafted image dimensions. The default is 256 MB. To raise the cap for + * high-resolution legitimate documents, use + * {@code System.setProperty(Filter.SYSPROP_CCITTFAX_MAXBYTES, String.valueOf(512 * 1024 * 1024L));} + */ + public static final String SYSPROP_CCITTFAX_MAXBYTES = "com.tom_roush.pdfbox.filter.ccittmaxbytes"; + /** * Constructor. */ @@ -61,7 +72,7 @@ protected Filter() * @throws IOException if the stream cannot be decoded */ public abstract DecodeResult decode(InputStream encoded, OutputStream decoded, COSDictionary parameters, - int index) throws IOException; + int index) throws IOException; /** * Decodes data, with optional DecodeOptions. Not all filters support all options, and so @@ -76,7 +87,7 @@ public abstract DecodeResult decode(InputStream encoded, OutputStream decoded, C * @throws IOException if the stream cannot be decoded */ public DecodeResult decode(InputStream encoded, OutputStream decoded, COSDictionary parameters, - int index, DecodeOptions options) throws IOException + int index, DecodeOptions options) throws IOException { return decode(encoded, decoded, parameters, index); } @@ -90,14 +101,14 @@ public DecodeResult decode(InputStream encoded, OutputStream decoded, COSDiction * @throws IOException if the stream cannot be encoded */ public final void encode(InputStream input, OutputStream encoded, COSDictionary parameters, - int index) throws IOException + int index) throws IOException { encode(input, encoded, parameters.asUnmodifiableDictionary()); } // implemented in subclasses protected abstract void encode(InputStream input, OutputStream encoded, - COSDictionary parameters) throws IOException; + COSDictionary parameters) throws IOException; // gets the decode params for a specific filter index, this is used to // normalise the DecodeParams entry so that it is always a dictionary @@ -107,8 +118,8 @@ protected COSDictionary getDecodeParams(COSDictionary dictionary, int index) COSBase obj = dictionary.getDictionaryObject(COSName.DP, COSName.DECODE_PARMS); if (filter instanceof COSName && obj instanceof COSDictionary) { - // PDFBOX-3932: The PDF specification requires "If there is only one filter and that - // filter has parameters, DecodeParms shall be set to the filter’s parameter dictionary" + // PDFBOX-3932: The PDF specification requires "If there is only one filter and that + // filter has parameters, DecodeParms shall be set to the filter’s parameter dictionary" // but tests show that Adobe means "one filter name object". return (COSDictionary)obj; } @@ -127,12 +138,61 @@ else if (filter instanceof COSArray && obj instanceof COSArray) else if (obj != null && !(filter instanceof COSArray || obj instanceof COSArray)) { Log.e("PdfBox-Android", "Expected DecodeParams to be an Array or Dictionary but found " + - obj.getClass().getName()); + obj.getClass().getName()); } return new COSDictionary(); } -// protected static ImageReader findImageReader(String formatName, String errorCause) throws MissingImageReaderException TODO: PdfBox-Android +// TODO: PdfBox-Android: javax.imageio not available +// /** +// * Finds a suitable image reader for a format. +// * +// * @param formatName The format to search for. +// * @param errorCause The probably cause if something goes wrong. +// * @return The image reader for the format. +// * @throws MissingImageReaderException if no image reader is found. +// */ +// protected static ImageReader findImageReader(String formatName, String errorCause) throws MissingImageReaderException +// { +// Iterator readers = ImageIO.getImageReadersByFormatName(formatName); +// ImageReader reader; +// while (readers.hasNext()) +// { +// reader = readers.next(); +// if (reader != null) +// { +// return reader; +// } +// } +// throw new MissingImageReaderException("Cannot read " + formatName + " image: " + errorCause); +// } +// +// /** +// * Finds a suitable image reader for an image format. +// * +// * @param formatName The image format to search for. +// * @param errorCause The probably cause if something goes wrong. +// * @return The image reader for the format. +// * @throws MissingImageReaderException if no image reader is found. +// */ +// public static ImageReader findRasterReader(String formatName, String errorCause) +// throws MissingImageReaderException +// { +// Iterator readers = ImageIO.getImageReadersByFormatName(formatName); +// while (readers.hasNext()) +// { +// ImageReader reader = readers.next(); +// if (reader != null) +// { +// if (reader.canReadRaster()) +// { +// return reader; +// } +// reader.dispose(); +// } +// } +// throw new MissingImageReaderException("Cannot read " + formatName + " image: " + errorCause); +// } /** * @return the ZIP compression level configured for PDFBox diff --git a/library/src/main/java/com/tom_roush/pdfbox/filter/JPXFilter.java b/library/src/main/java/com/tom_roush/pdfbox/filter/JPXFilter.java index be006da3a..ad0c2302a 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/filter/JPXFilter.java +++ b/library/src/main/java/com/tom_roush/pdfbox/filter/JPXFilter.java @@ -18,6 +18,7 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; +import android.graphics.Canvas; import android.graphics.Color; import android.os.Build; @@ -131,6 +132,19 @@ private Bitmap readJPX(InputStream input, DecodeOptions options, DecodeResult re // extract embedded color space if (!parameters.containsKey(COSName.COLORSPACE) && Build.VERSION.SDK_INT > Build.VERSION_CODES.O) { + if (image.hasAlpha() && parameters.getInt(COSName.SMASK_IN_DATA) > 0) + { + // PDFBOX-5657: save the soft mask in DecodeResult and use it later + // we never had SMaskInData = 2, maybe more work is needed + Bitmap smask = image.extractAlpha(); + result.setJPXSMask(smask); + // create opaque image + Bitmap bim = Bitmap.createBitmap( + image.getWidth(), image.getHeight(), Bitmap.Config.RGB_565); + Canvas canvas = new Canvas(bim); + canvas.drawBitmap(image, 0, 0, null); + image = bim; + } result.setColorSpace(new PDJPXColorSpace(image.getColorSpace())); } diff --git a/library/src/main/java/com/tom_roush/pdfbox/filter/LZWFilter.java b/library/src/main/java/com/tom_roush/pdfbox/filter/LZWFilter.java index e5683e010..1af439801 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/filter/LZWFilter.java +++ b/library/src/main/java/com/tom_roush/pdfbox/filter/LZWFilter.java @@ -29,7 +29,6 @@ import com.tom_roush.harmony.javax.imageio.stream.MemoryCacheImageOutputStream; import com.tom_roush.pdfbox.cos.COSDictionary; import com.tom_roush.pdfbox.cos.COSName; - /** * * This is the filter used for the LZWDecode filter. @@ -39,6 +38,10 @@ */ public class LZWFilter extends Filter { + /** + * Log instance. + */ + /** * The LZW clear table code. */ @@ -49,35 +52,27 @@ public class LZWFilter extends Filter */ public static final long EOD = 257; - //BEWARE: codeTable must be local to each method, because there is only - // one instance of each filter - /** * {@inheritDoc} */ @Override public DecodeResult decode(InputStream encoded, OutputStream decoded, - COSDictionary parameters, int index) throws IOException + COSDictionary parameters, int index) throws IOException { COSDictionary decodeParams = getDecodeParams(parameters, index); - int earlyChange = decodeParams.getInt(COSName.EARLY_CHANGE, 1); - - if (earlyChange != 0 && earlyChange != 1) - { - earlyChange = 1; - } - + boolean earlyChange = decodeParams.getInt(COSName.EARLY_CHANGE, 1) != 0; doLZWDecode(encoded, Predictor.wrapPredictor(decoded, decodeParams), earlyChange); return new DecodeResult(parameters); } - private void doLZWDecode(InputStream encoded, OutputStream decoded, int earlyChange) throws IOException + private void doLZWDecode(InputStream encoded, OutputStream decoded, boolean earlyChange) throws IOException { - List codeTable = new ArrayList(); + List codeTable = createCodeTable(); // includes CLEAR/EOD handling as needed int chunk = 9; final MemoryCacheImageInputStream in = new MemoryCacheImageInputStream(encoded); + + byte[] prev = null; // no previous string yet long nextCommand; - long prevCommand = -1; try { @@ -87,60 +82,50 @@ private void doLZWDecode(InputStream encoded, OutputStream decoded, int earlyCha { chunk = 9; codeTable = createCodeTable(); - prevCommand = -1; + prev = null; + continue; } - else + + byte[] curr; + + if (nextCommand < codeTable.size()) { - if (nextCommand < codeTable.size()) - { - byte[] data = codeTable.get((int) nextCommand); - byte firstByte = data[0]; - decoded.write(data); - if (prevCommand != -1) - { - checkIndexBounds(codeTable, prevCommand, in); - data = codeTable.get((int) prevCommand); - byte[] newData = Arrays.copyOf(data, data.length + 1); - newData[data.length] = firstByte; - codeTable.add(newData); - } - } - else + // Normal case: code exists + curr = codeTable.get((int) nextCommand); + decoded.write(curr); + + if (prev != null) { - checkIndexBounds(codeTable, prevCommand, in); - byte[] data = codeTable.get((int) prevCommand); - byte[] newData = Arrays.copyOf(data, data.length + 1); - newData[data.length] = data[0]; - decoded.write(newData); - codeTable.add(newData); + // Add prev + first(curr) + byte[] entry = Arrays.copyOf(prev, prev.length + 1); + entry[prev.length] = curr[0]; + codeTable.add(entry); } - - chunk = calculateChunk(codeTable.size(), earlyChange); - prevCommand = nextCommand; } + else if (nextCommand == codeTable.size() && prev != null) + { + // KwKwK case: code equals next available index + curr = Arrays.copyOf(prev, prev.length + 1); + curr[prev.length] = prev[0]; + decoded.write(curr); + codeTable.add(curr); + } + else + { + // Corrupt stream (code out of range, or KwKwK without prev) + throw new EOFException("Invalid LZW code: " + nextCommand); + } + + prev = curr; // move forward + chunk = calculateChunk(codeTable.size(), earlyChange); } } catch (EOFException ex) { - Log.w("PdfBox-Android", "Premature EOF in LZW stream, EOD code missing"); + Log.w("PdfBox-Android", "Premature EOF in LZW stream, EOD code missing", ex); } - decoded.flush(); - } - private void checkIndexBounds(List codeTable, long index, MemoryCacheImageInputStream in) - throws IOException - { - if (index < 0) - { - throw new IOException("negative array index: " + index + " near offset " - + in.getStreamPosition()); - } - if (index >= codeTable.size()) - { - throw new IOException("array index overflow: " + index + - " >= " + codeTable.size() + " near offset " - + in.getStreamPosition()); - } + decoded.flush(); } /** @@ -148,7 +133,7 @@ private void checkIndexBounds(List codeTable, long index, MemoryCacheIma */ @Override protected void encode(InputStream rawData, OutputStream encoded, COSDictionary parameters) - throws IOException + throws IOException { List codeTable = createCodeTable(); int chunk = 9; @@ -174,7 +159,7 @@ protected void encode(InputStream rawData, OutputStream encoded, COSDictionary p if (newFoundCode == -1) { // use previous - chunk = calculateChunk(codeTable.size() - 1, 1); + chunk = calculateChunk(codeTable.size() - 1, true); out.writeBits(foundCode, chunk); // create new table entry codeTable.add(inputPattern); @@ -197,16 +182,16 @@ protected void encode(InputStream rawData, OutputStream encoded, COSDictionary p } if (foundCode != -1) { - chunk = calculateChunk(codeTable.size() - 1, 1); + chunk = calculateChunk(codeTable.size() - 1, true); out.writeBits(foundCode, chunk); } - // PPDFBOX-1977: the decoder wouldn't know that the encoder would output - // an EOD as code, so he would have increased his own code table and - // possibly adjusted the chunk. Therefore, the encoder must behave as + // PPDFBOX-1977: the decoder wouldn't know that the encoder would output + // an EOD as code, so he would have increased his own code table and + // possibly adjusted the chunk. Therefore, the encoder must behave as // if the code table had just grown and thus it must be checked it is // needed to adjust the chunk, based on an increased table size parameter - chunk = calculateChunk(codeTable.size(), 1); + chunk = calculateChunk(codeTable.size(), true); out.writeBits(EOD, chunk); @@ -219,50 +204,47 @@ protected void encode(InputStream rawData, OutputStream encoded, COSDictionary p } /** - * Find the longest matching pattern in the code table. + * Find a matching pattern in the code table. * * @param codeTable The LZW code table. * @param pattern The pattern to be searched for. - * @return The index of the longest matching pattern or -1 if nothing is - * found. + * @return The index of the matching pattern or -1 if nothing is found. */ - private int findPatternCode(List codeTable, byte[] pattern) + private static int findPatternCode(List codeTable, byte[] pattern) { - int foundCode = -1; - int foundLen = 0; - for (int i = codeTable.size() - 1; i >= 0; --i) + // for the first 256 entries, index matches value + if (pattern.length == 1) { - if (i <= EOD) - { - // we're in the single byte area - if (foundCode != -1) - { - // we already found pattern with size > 1 - return foundCode; - } - else if (pattern.length > 1) - { - // we won't find anything here anyway - return -1; - } - } - byte[] tryPattern = codeTable.get(i); - if ((foundCode != -1 || tryPattern.length > foundLen) && Arrays.equals(tryPattern, pattern)) + return pattern[0]; + } + + // no need to test the first 256 + 2 entries against longer patterns + for (int i = 257; i < codeTable.size(); i++) + { + if (Arrays.equals(codeTable.get(i), pattern)) { - foundCode = i; - foundLen = tryPattern.length; + return i; } } - return foundCode; + + return -1; } /** - * Init the code table with 1 byte entries and the EOD and CLEAR_TABLE - * markers. + * Init the code table with 1 byte entries and the EOD and CLEAR_TABLE markers. */ - private List createCodeTable() + private static List createCodeTable() { List codeTable = new ArrayList(4096); + codeTable.addAll(INITIAL_CODE_TABLE); + return codeTable; + } + + private static final List INITIAL_CODE_TABLE = createInitialCodeTable(); + + private static List createInitialCodeTable() + { + List codeTable = new ArrayList(258); for (int i = 0; i < 256; ++i) { codeTable.add(new byte[] { (byte) (i & 0xFF) }); @@ -276,21 +258,22 @@ private List createCodeTable() * Calculate the appropriate chunk size * * @param tabSize the size of the code table - * @param earlyChange 0 or 1 for early chunk increase + * @param earlyChange true for early chunk increase * * @return a value between 9 and 12 */ - private int calculateChunk(int tabSize, int earlyChange) + private static int calculateChunk(int tabSize, boolean earlyChange) { - if (tabSize >= 2048 - earlyChange) + int i = tabSize + (earlyChange ? 1 : 0); + if (i >= 2048) { return 12; } - if (tabSize >= 1024 - earlyChange) + if (i >= 1024) { return 11; } - if (tabSize >= 512 - earlyChange) + if (i >= 512) { return 10; } diff --git a/library/src/main/java/com/tom_roush/pdfbox/filter/Predictor.java b/library/src/main/java/com/tom_roush/pdfbox/filter/Predictor.java index 9f0647dbd..a53bf4f37 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/filter/Predictor.java +++ b/library/src/main/java/com/tom_roush/pdfbox/filter/Predictor.java @@ -22,9 +22,8 @@ import com.tom_roush.pdfbox.cos.COSDictionary; import com.tom_roush.pdfbox.cos.COSName; - /** - * Helper class to contain predictor decoding used by Flate and LZW filter. + * Helper class to contain predictor decoding used by Flate and LZW filter. * To see the history, look at the FlateFilter class. */ public final class Predictor @@ -77,7 +76,7 @@ static void decodePredictorRow(int predictor, int colors, int bitsPerComponent, { int sub = ((actline[p] & 0xff) << 8) + (actline[p + 1] & 0xff); int left = (((actline[p - bytesPerPixel] & 0xff) << 8) - + (actline[p - bytesPerPixel + 1] & 0xff)); + + (actline[p - bytesPerPixel + 1] & 0xff)); actline[p] = (byte) (((sub + left) >> 8) & 0xff); actline[p + 1] = (byte) ((sub + left) & 0xff); } @@ -231,8 +230,9 @@ static int calcSetBitSeq(int by, int startBit, int bitSize, int val) * @param decodeParams Decode parameters for the stream * @return An OutputStream is returned, which will write decoded data * into the given stream. If no predictor is specified, the original stream is returned. + * @throws IOException */ - static OutputStream wrapPredictor(OutputStream out, COSDictionary decodeParams) + static OutputStream wrapPredictor(OutputStream out, COSDictionary decodeParams) throws IOException { int predictor = decodeParams.getInt(COSName.PREDICTOR); if (predictor > 1) @@ -276,6 +276,7 @@ private static final class PredictorOutputStream extends FilterOutputStream private boolean predictorRead = false; PredictorOutputStream(OutputStream out, int predictor, int colors, int bitsPerComponent, int columns) + throws IOException { super(out); this.predictor = predictor; @@ -283,6 +284,10 @@ private static final class PredictorOutputStream extends FilterOutputStream this.bitsPerComponent = bitsPerComponent; this.columns = columns; this.rowLength = calculateRowLength(colors, bitsPerComponent, columns); + if (rowLength < 0) + { + throw new IOException("Calculated row length is negative: " + rowLength); + } this.predictorPerRow = predictor >= 10; currentRow = new byte[rowLength]; lastRow = new byte[rowLength]; diff --git a/library/src/main/java/com/tom_roush/pdfbox/filter/RunLengthDecodeFilter.java b/library/src/main/java/com/tom_roush/pdfbox/filter/RunLengthDecodeFilter.java index 9ffb623ca..2a6cb28c4 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/filter/RunLengthDecodeFilter.java +++ b/library/src/main/java/com/tom_roush/pdfbox/filter/RunLengthDecodeFilter.java @@ -23,12 +23,12 @@ import java.io.OutputStream; import com.tom_roush.pdfbox.cos.COSDictionary; - /** * Decompresses data encoded using a byte-oriented run-length encoding algorithm, * reproducing the original text or binary data * * @author Ben Litchfield + * @author Tilman Hausherr */ final class RunLengthDecodeFilter extends Filter { @@ -36,7 +36,7 @@ final class RunLengthDecodeFilter extends Filter @Override public DecodeResult decode(InputStream encoded, OutputStream decoded, - COSDictionary parameters, int index) throws IOException + COSDictionary parameters, int index) throws IOException { int dupAmount; byte[] buffer = new byte[128]; @@ -77,8 +77,115 @@ public DecodeResult decode(InputStream encoded, OutputStream decoded, @Override protected void encode(InputStream input, OutputStream encoded, COSDictionary parameters) - throws IOException + throws IOException { - Log.w("PdfBox-Android", "RunLengthDecodeFilter.encode is not implemented yet, skipping this stream."); + // Not used in PDFBox except for testing the decoder. + int lastVal = -1; + int byt; + int count = 0; + boolean equality = false; + + // buffer for "unequal" runs, size between 2 and 128 + byte[] buf = new byte[128]; + + while ((byt = input.read()) != -1) + { + if (lastVal == -1) + { + // first time + lastVal = byt; + count = 1; + } + else + { + if (count == 128) + { + if (equality) + { + // max length of equals + encoded.write(129); // = 257 - 128 + encoded.write(lastVal); + } + else + { + // max length of unequals + encoded.write(127); + encoded.write(buf, 0, 128); + } + equality = false; + lastVal = byt; + count = 1; + } + else if (count == 1) + { + if (byt == lastVal) + { + equality = true; + } + else + { + buf[0] = (byte) lastVal; + buf[1] = (byte) byt; + lastVal = byt; + } + count = 2; + } + else + { + // 1 < count < 128 + if (byt == lastVal) + { + if (equality) + { + ++count; + } + else + { + // write all we got except the last + encoded.write(count - 2); + encoded.write(buf, 0, count - 1); + count = 2; + equality = true; + } + } + else + { + if (equality) + { + // equality ends here + encoded.write(257 - count); + encoded.write(lastVal); + equality = false; + count = 1; + } + else + { + buf[count] = (byte) byt; + ++count; + } + lastVal = byt; + } + } + } + } + if (count > 0) + { + if (count == 1) + { + encoded.write(0); + encoded.write(lastVal); + } + else if (equality) + { + encoded.write(257 - count); + encoded.write(lastVal); + } + else + { + encoded.write(count - 1); + encoded.write(buf, 0, count); + } + } + encoded.write(RUN_LENGTH_EOD); } } diff --git a/library/src/main/java/com/tom_roush/pdfbox/io/ScratchFile.java b/library/src/main/java/com/tom_roush/pdfbox/io/ScratchFile.java index 1abcdaabe..078a6659e 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/io/ScratchFile.java +++ b/library/src/main/java/com/tom_roush/pdfbox/io/ScratchFile.java @@ -20,12 +20,14 @@ import java.io.Closeable; import java.io.File; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; +import java.util.ArrayList; import java.util.BitSet; +import java.util.List; import com.tom_roush.pdfbox.android.PDFBoxConfig; - /** * Implements a memory page handling mechanism as base for creating (multiple) * {@link RandomAccess} buffers each having its set of pages (implemented by @@ -51,6 +53,7 @@ */ public class ScratchFile implements Closeable { + /** number of pages by which we enlarge the scratch file (reduce I/O-operations) */ private static final int ENLARGE_PAGE_COUNT = 16; /** in case of unrestricted main memory usage this is the initial number of pages @@ -75,6 +78,8 @@ public class ScratchFile implements Closeable private final boolean useScratchFile; private final boolean maxMainMemoryIsRestricted; + private final List buffers = new ArrayList(); + private volatile boolean isClosed = false; /** @@ -100,7 +105,7 @@ public ScratchFile(File scratchFileDirectory) throws IOException *

    Depending on the size of allowed memory usage a number of pages (memorySize/{@link #PAGE_SIZE}) * will be stored in-memory and only additional pages will be written to/read from scratch file.

    * - * @param memUsageSetting set how memory/temporary files are used for buffering streams etc. + * @param memUsageSetting set how memory/temporary files are used for buffering streams etc. * * @throws IOException If scratch file directory was given but don't exist. */ @@ -116,14 +121,14 @@ public ScratchFile(MemoryUsageSetting memUsageSetting) throws IOException } maxPageCount = memUsageSetting.isStorageRestricted() ? - (int) Math.min(Integer.MAX_VALUE, memUsageSetting.getMaxStorageBytes() / PAGE_SIZE) : - Integer.MAX_VALUE; + (int) Math.min(Integer.MAX_VALUE, memUsageSetting.getMaxStorageBytes() / PAGE_SIZE) : + Integer.MAX_VALUE; inMemoryMaxPageCount = memUsageSetting.useMainMemory() ? - (memUsageSetting.isMainMemoryRestricted() ? - (int) Math.min(Integer.MAX_VALUE, memUsageSetting.getMaxMainMemoryBytes() / PAGE_SIZE) : - Integer.MAX_VALUE) : - 0; + (memUsageSetting.isMainMemoryRestricted() ? + (int) Math.min(Integer.MAX_VALUE, memUsageSetting.getMaxMainMemoryBytes() / PAGE_SIZE) : + Integer.MAX_VALUE) : + 0; inMemoryPages = new byte[maxMainMemoryIsRestricted ? inMemoryMaxPageCount : INIT_UNRESTRICTED_MAINMEM_PAGECOUNT][]; freePages.set(0, inMemoryPages.length); @@ -184,7 +189,7 @@ int getNewPage() throws IOException } /** - * This will provide new free pages by either enlarging the scratch file + * This will provide new free pages by either enlarging the scratch file * by a number of pages defined by {@link #ENLARGE_PAGE_COUNT} - in case * scratch file usage is allowed - or increase the {@link #inMemoryPages} * array in case main memory was not restricted. If neither of both is @@ -218,7 +223,7 @@ private void enlarge() throws IOException { raf = new java.io.RandomAccessFile(file, "rw"); } - catch (IOException e) + catch (FileNotFoundException e) { if (!file.delete()) { @@ -234,7 +239,7 @@ private void enlarge() throws IOException if (expectedFileLen != fileLen) { throw new IOException("Expected scratch file size of " + expectedFileLen + - " but found " + fileLen + " in file " + file); + " but found " + fileLen + " in file " + file); } // enlarge if we do not int overflow @@ -244,7 +249,7 @@ private void enlarge() throws IOException { Log.d("PdfBox-Android", "file: " + file); Log.d("PdfBox-Android", "fileLen before: " + fileLen + ", raf length: " + raf.length() + - ", file length: " + file.length()); + ", file length: " + file.length()); } fileLen += ENLARGE_PAGE_COUNT * PAGE_SIZE; @@ -252,7 +257,7 @@ private void enlarge() throws IOException if (PDFBoxConfig.isDebugEnabled()) { Log.d("PdfBox-Android", "fileLen after1: " + fileLen + ", raf length: " + raf.length() + - ", file length: " + file.length()); + ", file length: " + file.length()); } if (fileLen != raf.length()) { @@ -299,7 +304,7 @@ int getPageSize() * * @param pageIdx index of page to read * - * @return byte array of size {@link #PAGE_SIZE} filled with page data read from file + * @return byte array of size {@link #PAGE_SIZE} filled with page data read from file * * @throws IOException */ @@ -420,7 +425,20 @@ void checkClosed() throws IOException */ public RandomAccess createBuffer() throws IOException { - return new ScratchFileBuffer(this); + ScratchFileBuffer newBuffer = new ScratchFileBuffer(this); + synchronized (buffers) + { + buffers.add(newBuffer); + } + return newBuffer; + } + + void removeBuffer(ScratchFileBuffer buffer) + { + synchronized (buffers) + { + buffers.remove(buffer); + } } /** @@ -435,7 +453,7 @@ public RandomAccess createBuffer() throws IOException */ public RandomAccess createBuffer(InputStream input) throws IOException { - ScratchFileBuffer buf = new ScratchFileBuffer(this); + RandomAccess buf = createBuffer(); byte[] byteBuffer = new byte[8192]; int bytesRead; @@ -452,7 +470,7 @@ public RandomAccess createBuffer(InputStream input) throws IOException * Allows a buffer which is cleared/closed to release its pages to be re-used. * * @param pageIndexes pages indexes of pages to release - * @param count number of page indexes contained in provided array + * @param count number of page indexes contained in provided array */ void markPagesAsFree(int[] pageIndexes, int off, int count) { @@ -467,7 +485,7 @@ void markPagesAsFree(int[] pageIndexes, int off, int count) { if (pageIdx < inMemoryMaxPageCount) { inMemoryPages[pageIdx] = null; // remark: not in ioLock synchronization since behavior won't - // change even in case of parallel called 'enlarge' method + // change even in case of parallel called 'enlarge' method } } @@ -496,6 +514,15 @@ public void close() throws IOException isClosed = true; + for (ScratchFileBuffer buffer : buffers) + { + if (buffer != null && !buffer.isClosed()) + { + buffer.close(false); + } + } + buffers.clear(); + if (raf != null) { try diff --git a/library/src/main/java/com/tom_roush/pdfbox/io/ScratchFileBuffer.java b/library/src/main/java/com/tom_roush/pdfbox/io/ScratchFileBuffer.java index d3052d202..4a6435c2f 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/io/ScratchFileBuffer.java +++ b/library/src/main/java/com/tom_roush/pdfbox/io/ScratchFileBuffer.java @@ -16,14 +16,8 @@ */ package com.tom_roush.pdfbox.io; -import android.util.Log; - import java.io.EOFException; import java.io.IOException; - -import com.tom_roush.pdfbox.android.PDFBoxConfig; -import com.tom_roush.pdfbox.cos.COSStream; - /** * Implementation of {@link RandomAccess} as sequence of multiple fixed size pages handled * by {@link ScratchFile}. @@ -483,44 +477,30 @@ public int read(byte[] b, int off, int len) throws IOException @Override public void close() throws IOException { - if (pageHandler != null) { - - pageHandler.markPagesAsFree(pageIndexes, 0, pageCount); - pageHandler = null; - - pageIndexes = null; - currentPage = null; - currentPageOffset = 0; - currentPagePositionInPageIndexes = -1; - positionInPage = 0; - size = 0; - } + close(true); } /** - * While calling finalize is normally discouraged we will have to - * use it here as long as closing a scratch file buffer is not - * done in every case. Currently {@link COSStream} creates new - * buffers without closing the old one - which might still be - * used. + * Release all resources and remove this buffer from ScratchFile. * - *

    Enabling debugging one will see if there are still cases - * where the buffer is not closed.

    + * @param removeBuffer remove buffer from ScratchFile if set to true */ - @Override - protected void finalize() throws Throwable + void close(boolean removeBuffer) { - try + if (pageHandler != null) { - if ((pageHandler != null) && PDFBoxConfig.isDebugEnabled()) + pageHandler.markPagesAsFree(pageIndexes, 0, pageCount); + if (removeBuffer) { - Log.d("PdfBox-Android", "ScratchFileBuffer not closed!"); + pageHandler.removeBuffer(this); } - close(); - } - finally - { - super.finalize(); + pageHandler = null; + pageIndexes = null; + currentPage = null; + currentPageOffset = 0; + currentPagePositionInPageIndexes = -1; + positionInPage = 0; + size = 0; } } } diff --git a/library/src/main/java/com/tom_roush/pdfbox/multipdf/LayerUtility.java b/library/src/main/java/com/tom_roush/pdfbox/multipdf/LayerUtility.java index 397c59682..0831ae2a6 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/multipdf/LayerUtility.java +++ b/library/src/main/java/com/tom_roush/pdfbox/multipdf/LayerUtility.java @@ -35,8 +35,8 @@ import com.tom_roush.pdfbox.pdmodel.PDDocument; import com.tom_roush.pdfbox.pdmodel.PDDocumentCatalog; import com.tom_roush.pdfbox.pdmodel.PDPage; -import com.tom_roush.pdfbox.pdmodel.PDPageContentStream; import com.tom_roush.pdfbox.pdmodel.PDPageContentStream.AppendMode; +import com.tom_roush.pdfbox.pdmodel.PDPageContentStream; import com.tom_roush.pdfbox.pdmodel.PDResources; import com.tom_roush.pdfbox.pdmodel.common.PDRectangle; import com.tom_roush.pdfbox.pdmodel.common.PDStream; @@ -44,7 +44,6 @@ import com.tom_roush.pdfbox.pdmodel.graphics.optionalcontent.PDOptionalContentGroup; import com.tom_roush.pdfbox.pdmodel.graphics.optionalcontent.PDOptionalContentProperties; import com.tom_roush.pdfbox.util.Matrix; - /** * This class allows to import pages as Form XObjects into a document and use them to create layers * (optional content groups). It should used only on loaded documents, not on generated documents @@ -52,6 +51,7 @@ */ public class LayerUtility { + private static final boolean DEBUG = true; private final PDDocument targetDoc; @@ -59,12 +59,12 @@ public class LayerUtility /** * Creates a new instance. - * @param document the PDF document to modify + * @param targetDoc the PDF document to modify */ - public LayerUtility(PDDocument document) + public LayerUtility(PDDocument targetDoc) { - this.targetDoc = document; - this.cloner = new PDFCloneUtility(document); + this.targetDoc = targetDoc; + this.cloner = new PDFCloneUtility(targetDoc); } /** @@ -131,7 +131,7 @@ else if( contents instanceof COSArray ) * make sure that the graphics state is reset. * * @param sourceDoc the source PDF document that contains the page to be copied - * @param pageNumber the page number of the page to be copied + * @param pageNumber the 0-based page number of the page to be copied * @return a Form XObject containing the original page's content * @throws IOException if an I/O error occurs */ @@ -142,7 +142,7 @@ public PDFormXObject importPageAsForm(PDDocument sourceDoc, int pageNumber) thro } private static final Set PAGE_TO_FORM_FILTER = - new HashSet(Arrays.asList("Group", "LastModified", "Metadata")); + new HashSet(Arrays.asList("Group", "LastModified", "Metadata")); /** * Imports a page from some PDF file as a Form XObject so it can be placed on another page @@ -184,25 +184,25 @@ public PDFormXObject importPageAsForm(PDDocument sourceDoc, PDPage page) throws //Transform to FOP's user space //at.scale(1 / viewBox.getWidth(), 1 / viewBox.getHeight()); at.translate(mediaBox.getLowerLeftX() - viewBox.getLowerLeftX(), - mediaBox.getLowerLeftY() - viewBox.getLowerLeftY()); + mediaBox.getLowerLeftY() - viewBox.getLowerLeftY()); switch (rotation) { - case 90: - at.scale(viewBox.getWidth() / viewBox.getHeight(), viewBox.getHeight() / viewBox.getWidth()); - at.translate(0, viewBox.getWidth()); - at.rotate(-Math.PI / 2.0); - break; - case 180: - at.translate(viewBox.getWidth(), viewBox.getHeight()); - at.rotate(-Math.PI); - break; - case 270: - at.scale(viewBox.getWidth() / viewBox.getHeight(), viewBox.getHeight() / viewBox.getWidth()); - at.translate(viewBox.getHeight(), 0); - at.rotate(-Math.PI * 1.5); - break; - default: - //no additional transformations necessary + case 90: + at.scale(viewBox.getWidth() / viewBox.getHeight(), viewBox.getHeight() / viewBox.getWidth()); + at.translate(0, viewBox.getWidth()); + at.rotate(-Math.PI / 2.0); + break; + case 180: + at.translate(viewBox.getWidth(), viewBox.getHeight()); + at.rotate(-Math.PI); + break; + case 270: + at.scale(viewBox.getWidth() / viewBox.getHeight(), viewBox.getHeight() / viewBox.getWidth()); + at.translate(viewBox.getHeight(), 0); + at.rotate(-Math.PI * 1.5); + break; + default: + //no additional transformations necessary } //Compensate for Crop Boxes not starting at 0,0 at.translate(-viewBox.getLowerLeftX(), -viewBox.getLowerLeftY()); @@ -240,8 +240,8 @@ public PDFormXObject importPageAsForm(PDDocument sourceDoc, PDPage page) throws * @throws IOException if an I/O error occurs */ public PDOptionalContentGroup appendFormAsLayer(PDPage targetPage, - PDFormXObject form, AffineTransform transform, - String layerName) throws IOException + PDFormXObject form, AffineTransform transform, + String layerName) throws IOException { PDDocumentCatalog catalog = targetDoc.getDocumentCatalog(); PDOptionalContentProperties ocprops = catalog.getOCProperties(); @@ -258,16 +258,16 @@ public PDOptionalContentGroup appendFormAsLayer(PDPage targetPage, PDRectangle cropBox = targetPage.getCropBox(); if ((cropBox.getLowerLeftX() < 0 || cropBox.getLowerLeftY() < 0) && transform.isIdentity()) { - // PDFBOX-4044 + // PDFBOX-4044 Log.w("PdfBox-Android", "Negative cropBox " + cropBox + - " and identity transform may make your form invisible"); + " and identity transform may make your form invisible"); } PDOptionalContentGroup layer = new PDOptionalContentGroup(layerName); ocprops.addGroup(layer); PDPageContentStream contentStream = new PDPageContentStream( - targetDoc, targetPage, AppendMode.APPEND, !DEBUG); + targetDoc, targetPage, AppendMode.APPEND, !DEBUG); contentStream.beginMarkedContent(COSName.OC, layer); contentStream.saveGraphicsState(); contentStream.transform(new Matrix(transform)); @@ -280,7 +280,7 @@ public PDOptionalContentGroup appendFormAsLayer(PDPage targetPage, } private void transferDict(COSDictionary orgDict, COSDictionary targetDict, Set filter) - throws IOException + throws IOException { for (Map.Entry entry : orgDict.entrySet()) { @@ -314,7 +314,7 @@ private void importOcProperties(PDDocument srcDoc) throws IOException if (dstOCProperties == null) { dstCatalog.setOCProperties(new PDOptionalContentProperties( - (COSDictionary) cloner.cloneForNewDocument(srcOCProperties))); + (COSDictionary) cloner.cloneForNewDocument(srcOCProperties))); } else { diff --git a/library/src/main/java/com/tom_roush/pdfbox/multipdf/Overlay.java b/library/src/main/java/com/tom_roush/pdfbox/multipdf/Overlay.java index ec8c18996..807606e43 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/multipdf/Overlay.java +++ b/library/src/main/java/com/tom_roush/pdfbox/multipdf/Overlay.java @@ -16,6 +16,8 @@ */ package com.tom_roush.pdfbox.multipdf; +import android.util.Log; + import java.io.Closeable; import java.io.File; import java.io.IOException; @@ -31,6 +33,7 @@ import java.util.Set; import com.tom_roush.harmony.awt.geom.AffineTransform; +import com.tom_roush.pdfbox.android.PDFBoxConfig; import com.tom_roush.pdfbox.cos.COSArray; import com.tom_roush.pdfbox.cos.COSBase; import com.tom_roush.pdfbox.cos.COSDictionary; @@ -44,7 +47,6 @@ import com.tom_roush.pdfbox.pdmodel.PDResources; import com.tom_roush.pdfbox.pdmodel.common.PDRectangle; import com.tom_roush.pdfbox.pdmodel.graphics.form.PDFormXObject; - /** * Adds an overlay to an existing PDF document. * @@ -53,6 +55,7 @@ */ public class Overlay implements Closeable { + /** * Possible location of the overlaid pages: foreground or background. */ @@ -62,13 +65,14 @@ public enum Position } private LayoutPage defaultOverlayPage; + private final Map rotatedDefaultOverlayPagesMap = new HashMap(); private LayoutPage firstPageOverlayPage; private LayoutPage lastPageOverlayPage; private LayoutPage oddPageOverlayPage; private LayoutPage evenPageOverlayPage; - private final Set openDocuments = new HashSet(); - private Map specificPageOverlayPage = new HashMap(); + private final Set openDocumentsSet = new HashSet(); + private Map specificPageOverlayLayoutPageMap = new HashMap(); private Position position = Position.BACKGROUND; @@ -76,30 +80,31 @@ public enum Position private PDDocument inputPDFDocument = null; private String defaultOverlayFilename = null; - private PDDocument defaultOverlay = null; + private PDDocument defaultOverlayDocument = null; private String firstPageOverlayFilename = null; - private PDDocument firstPageOverlay = null; + private PDDocument firstPageOverlayDocument = null; private String lastPageOverlayFilename = null; - private PDDocument lastPageOverlay = null; + private PDDocument lastPageOverlayDocument = null; private String allPagesOverlayFilename = null; - private PDDocument allPagesOverlay = null; + private PDDocument allPagesOverlayDocument = null; private String oddPageOverlayFilename = null; - private PDDocument oddPageOverlay = null; + private PDDocument oddPageOverlayDocument = null; private String evenPageOverlayFilename = null; - private PDDocument evenPageOverlay = null; + private PDDocument evenPageOverlayDocument = null; private int numberOfOverlayPages = 0; private boolean useAllOverlayPages = false; + private boolean adjustRotation = false; /** * This will add overlays to a document. * - * @param specificPageOverlayFile Optional map of overlay files of which the first page will be + * @param specificPageOverlayMap Optional map of overlay files of which the first page will be * used for specific pages of the input document. The page numbers are 1-based. The map must be * empty (but not null) if no specific mappings are used. * @@ -107,24 +112,26 @@ public enum Position * the input document was passed by {@link #setInputPDF(PDDocument) setInputPDF(PDDocument)} * then it is that object that is returned. * - * @throws IOException if something went wrong + * @throws IOException if something went wrong. + * @throws IllegalArgumentException if the input document is missing. */ - public PDDocument overlay(Map specificPageOverlayFile) throws IOException + public PDDocument overlay(Map specificPageOverlayMap) throws IOException { Map layouts = new HashMap(); String path; loadPDFs(); - for (Map.Entry e : specificPageOverlayFile.entrySet()) + for (Map.Entry e : specificPageOverlayMap.entrySet()) { path = e.getValue(); LayoutPage layoutPage = layouts.get(path); if (layoutPage == null) { PDDocument doc = loadPDF(path); - layouts.put(path, getLayoutPage(doc)); - openDocuments.add(doc); + layoutPage = createLayoutPageFromDocument(doc); + layouts.put(path, layoutPage); + openDocumentsSet.add(doc); } - specificPageOverlayPage.put(e.getKey(), layoutPage); + specificPageOverlayLayoutPageMap.put(e.getKey(), layoutPage); } processPages(inputPDFDocument); return inputPDFDocument; @@ -134,7 +141,7 @@ public PDDocument overlay(Map specificPageOverlayFile) throws I * This will add overlays documents to a document. If you created the overlay documents with * subsetted fonts, you need to save them first so that the subsetting gets done. * - * @param specificPageOverlayDocuments Optional map of overlay documents for specific pages. The + * @param specificPageOverlayDocumentMap Optional map of overlay documents for specific pages. The * page numbers are 1-based. The map must be empty (but not null) if no specific mappings are * used. * @@ -144,15 +151,15 @@ public PDDocument overlay(Map specificPageOverlayFile) throws I * * @throws IOException if something went wrong */ - public PDDocument overlayDocuments(Map specificPageOverlayDocuments) throws IOException + public PDDocument overlayDocuments(Map specificPageOverlayDocumentMap) throws IOException { loadPDFs(); - for (Map.Entry e : specificPageOverlayDocuments.entrySet()) + for (Map.Entry e : specificPageOverlayDocumentMap.entrySet()) { PDDocument doc = e.getValue(); if (doc != null) { - specificPageOverlayPage.put(e.getKey(), getLayoutPage(doc)); + specificPageOverlayLayoutPageMap.put(e.getKey(), createLayoutPageFromDocument(doc)); } } processPages(inputPDFDocument); @@ -167,36 +174,37 @@ public PDDocument overlayDocuments(Map specificPageOverlayD @Override public void close() throws IOException { - if (defaultOverlay != null) + if (defaultOverlayDocument != null) { - defaultOverlay.close(); + defaultOverlayDocument.close(); } - if (firstPageOverlay != null) + if (firstPageOverlayDocument != null) { - firstPageOverlay.close(); + firstPageOverlayDocument.close(); } - if (lastPageOverlay != null) + if (lastPageOverlayDocument != null) { - lastPageOverlay.close(); + lastPageOverlayDocument.close(); } - if (allPagesOverlay != null) + if (allPagesOverlayDocument != null) { - allPagesOverlay.close(); + allPagesOverlayDocument.close(); } - if (oddPageOverlay != null) + if (oddPageOverlayDocument != null) { - oddPageOverlay.close(); + oddPageOverlayDocument.close(); } - if (evenPageOverlay != null) + if (evenPageOverlayDocument != null) { - evenPageOverlay.close(); + evenPageOverlayDocument.close(); } - for (PDDocument doc : openDocuments) + for (PDDocument doc : openDocumentsSet) { doc.close(); } - openDocuments.clear(); - specificPageOverlayPage.clear(); + openDocumentsSet.clear(); + specificPageOverlayLayoutPageMap.clear(); + rotatedDefaultOverlayPagesMap.clear(); } private void loadPDFs() throws IOException @@ -206,61 +214,65 @@ private void loadPDFs() throws IOException { inputPDFDocument = loadPDF(inputFileName); } + if (inputPDFDocument == null) + { + throw new IllegalArgumentException("No input document"); + } // default overlay PDF if (defaultOverlayFilename != null) { - defaultOverlay = loadPDF(defaultOverlayFilename); + defaultOverlayDocument = loadPDF(defaultOverlayFilename); } - if (defaultOverlay != null) + if (defaultOverlayDocument != null) { - defaultOverlayPage = getLayoutPage(defaultOverlay); + defaultOverlayPage = createLayoutPageFromDocument(defaultOverlayDocument); } // first page overlay PDF if (firstPageOverlayFilename != null) { - firstPageOverlay = loadPDF(firstPageOverlayFilename); + firstPageOverlayDocument = loadPDF(firstPageOverlayFilename); } - if (firstPageOverlay != null) + if (firstPageOverlayDocument != null) { - firstPageOverlayPage = getLayoutPage(firstPageOverlay); + firstPageOverlayPage = createLayoutPageFromDocument(firstPageOverlayDocument); } // last page overlay PDF if (lastPageOverlayFilename != null) { - lastPageOverlay = loadPDF(lastPageOverlayFilename); + lastPageOverlayDocument = loadPDF(lastPageOverlayFilename); } - if (lastPageOverlay != null) + if (lastPageOverlayDocument != null) { - lastPageOverlayPage = getLayoutPage(lastPageOverlay); + lastPageOverlayPage = createLayoutPageFromDocument(lastPageOverlayDocument); } // odd pages overlay PDF if (oddPageOverlayFilename != null) { - oddPageOverlay = loadPDF(oddPageOverlayFilename); + oddPageOverlayDocument = loadPDF(oddPageOverlayFilename); } - if (oddPageOverlay != null) + if (oddPageOverlayDocument != null) { - oddPageOverlayPage = getLayoutPage(oddPageOverlay); + oddPageOverlayPage = createLayoutPageFromDocument(oddPageOverlayDocument); } // even pages overlay PDF if (evenPageOverlayFilename != null) { - evenPageOverlay = loadPDF(evenPageOverlayFilename); + evenPageOverlayDocument = loadPDF(evenPageOverlayFilename); } - if (evenPageOverlay != null) + if (evenPageOverlayDocument != null) { - evenPageOverlayPage = getLayoutPage(evenPageOverlay); + evenPageOverlayPage = createLayoutPageFromDocument(evenPageOverlayDocument); } // all pages overlay PDF if (allPagesOverlayFilename != null) { - allPagesOverlay = loadPDF(allPagesOverlayFilename); + allPagesOverlayDocument = loadPDF(allPagesOverlayFilename); } - if (allPagesOverlay != null) + if (allPagesOverlayDocument != null) { - specificPageOverlayPage = getLayoutPages(allPagesOverlay); + specificPageOverlayLayoutPageMap = createPageOverlayLayoutPageMap(allPagesOverlayDocument); useAllOverlayPages = true; - numberOfOverlayPages = specificPageOverlayPage.size(); + numberOfOverlayPages = specificPageOverlayLayoutPageMap.size(); } } @@ -275,14 +287,14 @@ private PDDocument loadPDF(String pdfName) throws IOException private static final class LayoutPage { private final PDRectangle overlayMediaBox; - private final COSStream overlayContentStream; + private final COSStream overlayCOSStream; private final COSDictionary overlayResources; - private final short overlayRotation; + private int overlayRotation; - private LayoutPage(PDRectangle mediaBox, COSStream contentStream, COSDictionary resources, short rotation) + private LayoutPage(PDRectangle mediaBox, COSStream contentStream, COSDictionary resources, int rotation) { overlayMediaBox = mediaBox; - overlayContentStream = contentStream; + overlayCOSStream = contentStream; overlayResources = resources; overlayRotation = rotation; } @@ -295,7 +307,7 @@ private LayoutPage(PDRectangle mediaBox, COSStream contentStream, COSDictionary * @return * @throws IOException */ - private LayoutPage getLayoutPage(PDDocument doc) throws IOException + private LayoutPage createLayoutPageFromDocument(PDDocument doc) throws IOException { return createLayoutPage(doc.getPage(0)); } @@ -315,14 +327,15 @@ private LayoutPage createLayoutPage(PDPage page) throws IOException resources = new PDResources(); } return new LayoutPage(page.getMediaBox(), createCombinedContentStream(contents), - resources.getCOSObject(), (short) page.getRotation()); + resources.getCOSObject(), page.getRotation()); } - private Map getLayoutPages(PDDocument doc) throws IOException + private Map createPageOverlayLayoutPageMap(PDDocument doc) throws IOException { int i = 0; - Map layoutPages = new HashMap(); - for (PDPage page : doc.getPages()) + PDPageTree pageTree = doc.getPages(); + Map layoutPages = new HashMap(pageTree.getCount()); + for (PDPage page : pageTree) { layoutPages.put(i, createLayoutPage(page)); i++; @@ -381,6 +394,7 @@ else if (contents instanceof COSObject) private void processPages(PDDocument document) throws IOException { int pageCounter = 0; + PDFCloneUtility cloner = new PDFCloneUtility(document); PDPageTree pageTree = document.getPages(); int numberOfPages = pageTree.getCount(); for (PDPage page : pageTree) @@ -440,7 +454,7 @@ else if (contents instanceof COSArray) } private void overlayPage(PDPage page, LayoutPage layoutPage, COSArray array) - throws IOException + throws IOException { PDResources resources = page.getResources(); if (resources == null) @@ -448,16 +462,17 @@ private void overlayPage(PDPage page, LayoutPage layoutPage, COSArray array) resources = new PDResources(); page.setResources(resources); } - COSName xObjectId = createOverlayXObject(page, layoutPage); - array.add(createOverlayStream(page, layoutPage, xObjectId)); + PDFormXObject overlayFormXObject = createOverlayFormXObject(layoutPage); + COSName formXObjectId = resources.add(overlayFormXObject, "OL"); + array.add(createOverlayStream(page, layoutPage, formXObjectId)); } - private LayoutPage getLayoutPage(int pageNumber, int numberOfPages) + private LayoutPage getLayoutPage(int pageNumber, int numberOfPages) throws IOException { LayoutPage layoutPage = null; - if (!useAllOverlayPages && specificPageOverlayPage.containsKey(pageNumber)) + if (!useAllOverlayPages && specificPageOverlayLayoutPageMap.containsKey(pageNumber)) { - layoutPage = specificPageOverlayPage.get(pageNumber); + layoutPage = specificPageOverlayLayoutPageMap.get(pageNumber); } else if ((pageNumber == 1) && (firstPageOverlayPage != null)) { @@ -478,18 +493,45 @@ else if ((pageNumber % 2 == 0) && (evenPageOverlayPage != null)) else if (defaultOverlayPage != null) { layoutPage = defaultOverlayPage; + + if (adjustRotation) + { + // PDFBOX-6049: consider the rotation of the document page + // Note that this segment is only the second best solution to the problem. The best + // would be to make appropriate transforms in calculateAffineTransform() + PDPage page = inputPDFDocument.getPage(pageNumber - 1); + int rotation = page.getRotation(); + if (rotation != 0) + { + return createAdjustedLayoutPage(rotation); + } + } } else if (useAllOverlayPages) { int usePageNum = (pageNumber -1 ) % numberOfOverlayPages; - layoutPage = specificPageOverlayPage.get(usePageNum); + layoutPage = specificPageOverlayLayoutPageMap.get(usePageNum); } return layoutPage; } - private COSName createOverlayXObject(PDPage page, LayoutPage layoutPage) + private LayoutPage createAdjustedLayoutPage(int rotation) throws IOException + { + LayoutPage rotatedLayoutPage = rotatedDefaultOverlayPagesMap.get(rotation); + if (rotatedLayoutPage == null) + { + // createLayoutPage must be called because we can't reuse the COSStream + rotatedLayoutPage = createLayoutPage(defaultOverlayDocument.getPage(0)); + int newRotation = (rotatedLayoutPage.overlayRotation - rotation + 360) % 360; + rotatedLayoutPage.overlayRotation = newRotation; + rotatedDefaultOverlayPagesMap.put(rotation, rotatedLayoutPage); + } + return rotatedLayoutPage; + } + + private PDFormXObject createOverlayFormXObject(LayoutPage layoutPage) throws IOException { - PDFormXObject xobjForm = new PDFormXObject(layoutPage.overlayContentStream); + PDFormXObject xobjForm = new PDFormXObject(layoutPage.overlayCOSStream); xobjForm.setResources(new PDResources(layoutPage.overlayResources)); xobjForm.setFormType(1); xobjForm.setBBox(layoutPage.overlayMediaBox.createRetranslatedRectangle()); @@ -498,26 +540,25 @@ private COSName createOverlayXObject(PDPage page, LayoutPage layoutPage) { case 90: at.translate(0, layoutPage.overlayMediaBox.getWidth()); - at.rotate(Math.toRadians(-90)); + at.rotate(-Math.PI / 2.0); break; case 180: at.translate(layoutPage.overlayMediaBox.getWidth(), layoutPage.overlayMediaBox.getHeight()); - at.rotate(Math.toRadians(-180)); + at.rotate(-Math.PI); break; case 270: at.translate(layoutPage.overlayMediaBox.getHeight(), 0); - at.rotate(Math.toRadians(-270)); + at.rotate(-Math.PI * 1.5); break; default: break; } xobjForm.setMatrix(at); - PDResources resources = page.getResources(); - return resources.add(xobjForm, "OL"); + return xobjForm; } private COSStream createOverlayStream(PDPage page, LayoutPage layoutPage, COSName xObjectId) - throws IOException + throws IOException { // create a new content stream that executes the XObject content StringBuilder overlayStream = new StringBuilder(); @@ -536,7 +577,7 @@ private COSStream createOverlayStream(PDPage page, LayoutPage layoutPage, COSNam for (double v : flatmatrix) { overlayStream.append(float2String((float) v)); - overlayStream.append(" "); + overlayStream.append(' '); } overlayStream.append(" cm\n"); @@ -552,8 +593,9 @@ private COSStream createOverlayStream(PDPage page, LayoutPage layoutPage, COSNam /** * Calculate the transform to be used when positioning the overlay. The default implementation - * centers on the destination. Override this method to do your own, e.g. move to a corner, or - * rotate. + * centers on the destination and assumes (0,0) to be the lower left (This will be changed in + * 4.0, see PDFBOX-6048 why). Override this method to do your own, e.g. move to a corner, + * rotate, or zoom. * * @param page The page that will get the overlay. * @param overlayMediaBox The overlay media box. @@ -565,13 +607,17 @@ protected AffineTransform calculateAffineTransform(PDPage page, PDRectangle over PDRectangle pageMediaBox = page.getMediaBox(); float hShift = (pageMediaBox.getWidth() - overlayMediaBox.getWidth()) / 2.0f; float vShift = (pageMediaBox.getHeight() - overlayMediaBox.getHeight()) / 2.0f; + if (PDFBoxConfig.isDebugEnabled()) + { + Log.d("PdfBox-Android", "Overlay position: (" + hShift + "," + vShift + ")"); + } at.translate(hShift, vShift); return at; } private String float2String(float floatValue) { - // use a BigDecimal as intermediate state to avoid + // use a BigDecimal as intermediate state to avoid // a floating point string representation of the float value BigDecimal value = new BigDecimal(String.valueOf(floatValue)); String stringValue = value.toPlainString(); @@ -590,7 +636,7 @@ private COSStream createStream(String content) throws IOException { COSStream stream = inputPDFDocument.getDocument().createCOSStream(); OutputStream out = stream.createOutputStream( - content.length() > 20 ? COSName.FLATE_DECODE : null); + content.length() > 20 ? COSName.FLATE_DECODE : null); out.write(content.getBytes("ISO-8859-1")); out.close(); return stream; @@ -657,7 +703,7 @@ public void setDefaultOverlayFile(String defaultOverlayFile) */ public void setDefaultOverlayPDF(PDDocument defaultOverlayPDF) { - defaultOverlay = defaultOverlayPDF; + defaultOverlayDocument = defaultOverlayPDF; } /** @@ -688,7 +734,7 @@ public void setFirstPageOverlayFile(String firstPageOverlayFile) */ public void setFirstPageOverlayPDF(PDDocument firstPageOverlayPDF) { - firstPageOverlay = firstPageOverlayPDF; + firstPageOverlayDocument = firstPageOverlayPDF; } /** @@ -709,7 +755,7 @@ public void setLastPageOverlayFile(String lastPageOverlayFile) */ public void setLastPageOverlayPDF(PDDocument lastPageOverlayPDF) { - lastPageOverlay = lastPageOverlayPDF; + lastPageOverlayDocument = lastPageOverlayPDF; } /** @@ -731,7 +777,7 @@ public void setAllPagesOverlayFile(String allPagesOverlayFile) */ public void setAllPagesOverlayPDF(PDDocument allPagesOverlayPDF) { - allPagesOverlay = allPagesOverlayPDF; + allPagesOverlayDocument = allPagesOverlayPDF; } /** @@ -752,7 +798,7 @@ public void setOddPageOverlayFile(String oddPageOverlayFile) */ public void setOddPageOverlayPDF(PDDocument oddPageOverlayPDF) { - oddPageOverlay = oddPageOverlayPDF; + oddPageOverlayDocument = oddPageOverlayPDF; } /** @@ -773,6 +819,24 @@ public void setEvenPageOverlayFile(String evenPageOverlayFile) */ public void setEvenPageOverlayPDF(PDDocument evenPageOverlayPDF) { - evenPageOverlay = evenPageOverlayPDF; + evenPageOverlayDocument = evenPageOverlayPDF; + } + + /** + * This sets whether the overlay is to be rotated according to the rotation of the pages of the + * source document. This may look weird if the content of the document is also rotated. So it's + * really a users decision to activate this option if the overlay appears rotated in some pages + * of the result document and this isn't wanted. + *

    + * This setting will only apply to usage of the default overlay, because it is assumed that when + * using specific overlays for specific pages, it is known in advance what kind of input there + * is. + * + * @param adjustRotation if true, the overlay will always look the same when the result file is + * displayed on the screen. If false (default) then it will be rotated if the page is rotated. + */ + public void setAdjustRotation(boolean adjustRotation) + { + this.adjustRotation = adjustRotation; } } diff --git a/library/src/main/java/com/tom_roush/pdfbox/multipdf/PDFMergerUtility.java b/library/src/main/java/com/tom_roush/pdfbox/multipdf/PDFMergerUtility.java index 93598a1e7..f42c15c68 100644 --- a/library/src/main/java/com/tom_roush/pdfbox/multipdf/PDFMergerUtility.java +++ b/library/src/main/java/com/tom_roush/pdfbox/multipdf/PDFMergerUtility.java @@ -64,6 +64,8 @@ import com.tom_roush.pdfbox.pdmodel.documentinterchange.logicalstructure.PDStructureElement; import com.tom_roush.pdfbox.pdmodel.documentinterchange.logicalstructure.PDStructureTreeRoot; import com.tom_roush.pdfbox.pdmodel.graphics.color.PDOutputIntent; +import com.tom_roush.pdfbox.pdmodel.interactive.action.PDAction; +import com.tom_roush.pdfbox.pdmodel.interactive.action.PDActionFactory; import com.tom_roush.pdfbox.pdmodel.interactive.action.PDActionGoTo; import com.tom_roush.pdfbox.pdmodel.interactive.annotation.PDAnnotation; import com.tom_roush.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget; @@ -75,7 +77,6 @@ import com.tom_roush.pdfbox.pdmodel.interactive.form.PDField; import com.tom_roush.pdfbox.pdmodel.interactive.form.PDNonTerminalField; import com.tom_roush.pdfbox.pdmodel.interactive.viewerpreferences.PDViewerPreferences; - /** * This class will take a list of pdf documents and merge them, saving the * result in a new document. @@ -103,7 +104,7 @@ public class PDFMergerUtility * the PDFBOX_LEGACY_MODE. Currently supported are: *

      *
    • Page content and resources - *
    + * *
  • {@link DocumentMergeMode#PDFBOX_LEGACY_MODE} Keeps all files open until the * merge has been completed. This is currently necessary to merge documents * containing a Structure Tree.
    This is the standard mode for PDFBox 2.0. @@ -120,7 +121,7 @@ public enum DocumentMergeMode * *
  • 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 z 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