diff --git a/AUTHORS b/AUTHORS
index 332b853..78aad77 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,32 +1,32 @@
-# Names should be added to this file with this pattern:
-#
-# For individuals:
-#   Name <email address>
-#
-# For organizations:
-#   Organization <fnmatch pattern>
-#
-# See python fnmatch module documentation for more information.
-
-Andrey Khalyavin <halyavin@chromium.org>
-Brett Wilson <brettw@chromium.org>
-Chris Palmer <palmer@chromium.org>
-Finnur Thorarinsson <finnur@chromium.org>
-Jochen Eisinger <jochen@chromium.org>
-John Abd-El-Malek <jam@chromium.org>
-Julien Tinnes <jln@chromium.org>
-Kostya Serebryany <kcc@chromium.org>
-Lei Zhang <thestig@chromium.org>
-Lucas Nihlen <luken@chromium.org>
-Matt Giuca <mgiuca@chromium.org>
-Michael Doppler <m.doppler@gmail.com>
-Nico Weber <thakis@chromium.org>
-Peter Kasting <pkasting@chromium.org>
-Raymes Khoury <raymes@chromium.org>
-Reid Kleckner <rnk@chromium.org>
-Robert Sesek <rsesek@chromium.org>
-Thomas Sepez <tsepez@chromium.org>
-Jiang Jiang <jiangj@opera.com>
-
-Foxit Software Inc <*@foxitsoftware.com>
-Google Inc. <*@google.com>
+# Names should be added to this file with this pattern:
+#
+# For individuals:
+#   Name <email address>
+#
+# For organizations:
+#   Organization <fnmatch pattern>
+#
+# See python fnmatch module documentation for more information.
+
+Andrey Khalyavin <halyavin@chromium.org>
+Brett Wilson <brettw@chromium.org>
+Chris Palmer <palmer@chromium.org>
+Finnur Thorarinsson <finnur@chromium.org>
+Jochen Eisinger <jochen@chromium.org>
+John Abd-El-Malek <jam@chromium.org>
+Julien Tinnes <jln@chromium.org>
+Kostya Serebryany <kcc@chromium.org>
+Lei Zhang <thestig@chromium.org>
+Lucas Nihlen <luken@chromium.org>
+Matt Giuca <mgiuca@chromium.org>
+Michael Doppler <m.doppler@gmail.com>
+Nico Weber <thakis@chromium.org>
+Peter Kasting <pkasting@chromium.org>
+Raymes Khoury <raymes@chromium.org>
+Reid Kleckner <rnk@chromium.org>
+Robert Sesek <rsesek@chromium.org>
+Thomas Sepez <tsepez@chromium.org>
+Jiang Jiang <jiangj@opera.com>
+
+Foxit Software Inc <*@foxitsoftware.com>
+Google Inc. <*@google.com>
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp
index 6704656..86db177 100644
--- a/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp
@@ -519,8 +519,8 @@
     }
 }
 CPDF_IccProfile::CPDF_IccProfile(FX_LPCBYTE pData, FX_DWORD dwSize):
-    m_bsRGB(FALSE),
-    m_pTransform(NULL),
+    m_bsRGB(FALSE),
+    m_pTransform(NULL),
     m_nSrcComponents(0)
 {
     if (dwSize == 3144 && FXSYS_memcmp32(pData + 0x190, "sRGB IEC61966-2.1", 17) == 0) {
@@ -1376,13 +1376,13 @@
     if (ncomps) {
         FXSYS_memcpy32(pvalue->m_Comps, comps, ncomps * sizeof(FX_FLOAT));
     }
-    pvalue->m_pCountedPattern = NULL;
-    if (pPattern && pPattern->m_pDocument)
-    {
-        if (!pDocPageData) {
-            pDocPageData = pPattern->m_pDocument->GetPageData();
-        }
-        pvalue->m_pCountedPattern = pDocPageData->FindPatternPtr(pPattern->m_pPatternObj);
+    pvalue->m_pCountedPattern = NULL;
+    if (pPattern && pPattern->m_pDocument)
+    {
+        if (!pDocPageData) {
+            pDocPageData = pPattern->m_pDocument->GetPageData();
+        }
+        pvalue->m_pCountedPattern = pDocPageData->FindPatternPtr(pPattern->m_pPatternObj);
     }
 }
 void CPDF_Color::Copy(const CPDF_Color* pSrc)
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp
index fe5665d..5df6643 100644
--- a/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp
@@ -147,32 +147,32 @@
 {
     Clear(FALSE);
     Clear(TRUE);
-    FX_POSITION pos = m_PatternMap.GetStartPosition();
-    while (pos)
-    {
-        CPDF_Object* ptObj;
-        CPDF_CountedObject<CPDF_Pattern*>* ptData;
-        m_PatternMap.GetNextAssoc(pos, ptObj, ptData);
-        delete ptData;
-    }
-    m_PatternMap.RemoveAll();
-    pos = m_FontMap.GetStartPosition();
-    while (pos)
-    {
-        CPDF_Dictionary* fontDict;
-        CPDF_CountedObject<CPDF_Font*>* fontData;
-        m_FontMap.GetNextAssoc(pos, fontDict, fontData);
-        delete fontData;
-    }
-    m_FontMap.RemoveAll();
-    pos = m_ColorSpaceMap.GetStartPosition();
-    while (pos)
-    {
-        CPDF_Object* csKey;
-        CPDF_CountedObject<CPDF_ColorSpace*>* csData;
-        m_ColorSpaceMap.GetNextAssoc(pos, csKey, csData);
-        delete csData;
-    }
+    FX_POSITION pos = m_PatternMap.GetStartPosition();
+    while (pos)
+    {
+        CPDF_Object* ptObj;
+        CPDF_CountedObject<CPDF_Pattern*>* ptData;
+        m_PatternMap.GetNextAssoc(pos, ptObj, ptData);
+        delete ptData;
+    }
+    m_PatternMap.RemoveAll();
+    pos = m_FontMap.GetStartPosition();
+    while (pos)
+    {
+        CPDF_Dictionary* fontDict;
+        CPDF_CountedObject<CPDF_Font*>* fontData;
+        m_FontMap.GetNextAssoc(pos, fontDict, fontData);
+        delete fontData;
+    }
+    m_FontMap.RemoveAll();
+    pos = m_ColorSpaceMap.GetStartPosition();
+    while (pos)
+    {
+        CPDF_Object* csKey;
+        CPDF_CountedObject<CPDF_ColorSpace*>* csData;
+        m_ColorSpaceMap.GetNextAssoc(pos, csKey, csData);
+        delete csData;
+    }
     m_ColorSpaceMap.RemoveAll();
 }
 void CPDF_DocPageData::Clear(FX_BOOL bForceRelease)
@@ -673,24 +673,24 @@
         return;
     }
     PDF_DocPageData_Release<CPDF_Stream*, CPDF_StreamAcc*>(m_FontFileMap, pFontStream, NULL, bForce);
-}
-CPDF_CountedColorSpace* CPDF_DocPageData::FindColorSpacePtr(CPDF_Object* pCSObj) const
-{
-    if (!pCSObj) return NULL;
-    CPDF_CountedObject<CPDF_ColorSpace*>* csData;
-    if (m_ColorSpaceMap.Lookup(pCSObj, csData))
-    {
-        return csData;
-    }
-    return NULL;
 }
-CPDF_CountedPattern* CPDF_DocPageData::FindPatternPtr(CPDF_Object* pPatternObj) const
-{
-    if (!pPatternObj) return NULL;
-    CPDF_CountedObject<CPDF_Pattern*>* ptData;
-    if (m_PatternMap.Lookup(pPatternObj, ptData))
-    {
-        return ptData;
-    }
-    return NULL;
-}
+CPDF_CountedColorSpace* CPDF_DocPageData::FindColorSpacePtr(CPDF_Object* pCSObj) const
+{
+    if (!pCSObj) return NULL;
+    CPDF_CountedObject<CPDF_ColorSpace*>* csData;
+    if (m_ColorSpaceMap.Lookup(pCSObj, csData))
+    {
+        return csData;
+    }
+    return NULL;
+}
+CPDF_CountedPattern* CPDF_DocPageData::FindPatternPtr(CPDF_Object* pPatternObj) const
+{
+    if (!pPatternObj) return NULL;
+    CPDF_CountedObject<CPDF_Pattern*>* ptData;
+    if (m_PatternMap.Lookup(pPatternObj, ptData))
+    {
+        return ptData;
+    }
+    return NULL;
+}
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_pattern.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_pattern.cpp
index 4644302..9e61ce2 100644
--- a/core/src/fpdfapi/fpdf_page/fpdf_page_pattern.cpp
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_pattern.cpp
@@ -143,7 +143,7 @@
     }
     CPDF_DocPageData* pDocPageData = m_pDocument->GetPageData();
     m_pCS = pDocPageData->GetColorSpace(pCSObj, NULL);
-    if (m_pCS) {
+    if (m_pCS) {
         m_pCountedCS = pDocPageData->FindColorSpacePtr(m_pCS->GetArray());
     }
     m_ShadingType = pShadingDict->GetInteger(FX_BSTRC("ShadingType"));
diff --git a/core/src/fxcodec/codec/fx_codec_jpx_opj.cpp b/core/src/fxcodec/codec/fx_codec_jpx_opj.cpp
index 8dcecf9..c4a0f88 100644
--- a/core/src/fxcodec/codec/fx_codec_jpx_opj.cpp
+++ b/core/src/fxcodec/codec/fx_codec_jpx_opj.cpp
@@ -168,17 +168,17 @@
     d2 = b = FX_Alloc(int, (size_t)max);
     for(i = 0; i < maxh; ++i)
     {
-        for (j = 0; (OPJ_UINT32)j < (maxw & ~(OPJ_UINT32)1); j += 2)
-        {
-            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
-            ++y; ++r; ++g; ++b;
-            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
-            ++y; ++r; ++g; ++b; ++cb; ++cr;
-        }
-        if (j < maxw)
-        {
-            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
-            ++y; ++r; ++g; ++b; ++cb; ++cr;
+        for (j = 0; (OPJ_UINT32)j < (maxw & ~(OPJ_UINT32)1); j += 2)
+        {
+            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
+            ++y; ++r; ++g; ++b;
+            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
+            ++y; ++r; ++g; ++b; ++cb; ++cr;
+        }
+        if (j < maxw)
+        {
+            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
+            ++y; ++r; ++g; ++b; ++cb; ++cr;
         }
     }
     FX_Free(img->comps[0].data);
@@ -218,46 +218,46 @@
     d0 = r = FX_Alloc(int, (size_t)max);
     d1 = g = FX_Alloc(int, (size_t)max);
     d2 = b = FX_Alloc(int, (size_t)max);
-    for (i = 0; (OPJ_UINT32)i < (maxh & ~(OPJ_UINT32)1); i += 2)
-    {
-        ny = y + maxw;
-        nr = r + maxw;
-        ng = g + maxw;
-        nb = b + maxw;
-        for (j = 0; (OPJ_UINT32)j < (maxw & ~(OPJ_UINT32)1); j += 2)
-        {
-            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
-            ++y; ++r; ++g; ++b;
-            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
-            ++y; ++r; ++g; ++b;
-            sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb);
-            ++ny; ++nr; ++ng; ++nb;
-            sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb);
-            ++ny; ++nr; ++ng; ++nb; ++cb; ++cr;
-        }
-        if (j < maxw)
-        {
-            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
-            ++y; ++r; ++g; ++b;
-            sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb);
-            ++ny; ++nr; ++ng; ++nb; ++cb; ++cr;
-        }
-        y += maxw; r += maxw; g += maxw; b += maxw;
-    }
-    if (i < maxh)
-    {
-        for (j = 0; (OPJ_UINT32)j < (maxw & ~(OPJ_UINT32)1); j += 2)
-        {
-            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
-            ++y; ++r; ++g; ++b;
-            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
-            ++y; ++r; ++g; ++b; ++cb; ++cr;
-        }
-        if (j < maxw)
-        {
-            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
-        }
-    }
+    for (i = 0; (OPJ_UINT32)i < (maxh & ~(OPJ_UINT32)1); i += 2)
+    {
+        ny = y + maxw;
+        nr = r + maxw;
+        ng = g + maxw;
+        nb = b + maxw;
+        for (j = 0; (OPJ_UINT32)j < (maxw & ~(OPJ_UINT32)1); j += 2)
+        {
+            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
+            ++y; ++r; ++g; ++b;
+            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
+            ++y; ++r; ++g; ++b;
+            sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb);
+            ++ny; ++nr; ++ng; ++nb;
+            sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb);
+            ++ny; ++nr; ++ng; ++nb; ++cb; ++cr;
+        }
+        if (j < maxw)
+        {
+            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
+            ++y; ++r; ++g; ++b;
+            sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb);
+            ++ny; ++nr; ++ng; ++nb; ++cb; ++cr;
+        }
+        y += maxw; r += maxw; g += maxw; b += maxw;
+    }
+    if (i < maxh)
+    {
+        for (j = 0; (OPJ_UINT32)j < (maxw & ~(OPJ_UINT32)1); j += 2)
+        {
+            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
+            ++y; ++r; ++g; ++b;
+            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
+            ++y; ++r; ++g; ++b; ++cb; ++cr;
+        }
+        if (j < maxw)
+        {
+            sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
+        }
+    }
 
     FX_Free(img->comps[0].data);
     img->comps[0].data = d0;
diff --git a/core/src/fxge/freetype/fx_freetype.c b/core/src/fxge/freetype/fx_freetype.c
index fe144d6..78dec9a 100644
--- a/core/src/fxge/freetype/fx_freetype.c
+++ b/core/src/fxge/freetype/fx_freetype.c
@@ -7,176 +7,176 @@
 #include "../../../include/fxge/fx_freetype.h"
 #include "../../../../third_party/freetype/src/psnames/pstables.h"
 
-static int xyq_search_node(char* glyph_name, int name_offset, int table_offset, wchar_t unicode)
-{
-    int i, count;
-
-    // copy letters
-    while (1) {
-        glyph_name[name_offset] = ft_adobe_glyph_list[table_offset] & 0x7f;
-        name_offset++;
-        table_offset++;
-        if (!(ft_adobe_glyph_list[table_offset - 1] & 0x80)) break;
-    }
-    glyph_name[name_offset] = 0;
-
-    // get child count
-    count = ft_adobe_glyph_list[table_offset] & 0x7f;
-
-    // check if we have value for this node
-    if (ft_adobe_glyph_list[table_offset] & 0x80) {
-        unsigned short thiscode = ft_adobe_glyph_list[table_offset + 1] * 256 + ft_adobe_glyph_list[table_offset + 2];
-        if (thiscode == (unsigned short)unicode)	// found it!
-            return 1;
-        table_offset += 3;
-    }
-    else
-        table_offset++;
-
-    // now search in sub-nodes
-    if (count == 0) return 0;
-    for (i = 0; i < count; i++) {
-        int child_offset = ft_adobe_glyph_list[table_offset + i * 2] * 256 + ft_adobe_glyph_list[table_offset + i * 2 + 1];
-        if (xyq_search_node(glyph_name, name_offset, child_offset, unicode))
-            // found in child
-            return 1;
-    }
-    return 0;
+static int xyq_search_node(char* glyph_name, int name_offset, int table_offset, wchar_t unicode)
+{
+    int i, count;
+
+    // copy letters
+    while (1) {
+        glyph_name[name_offset] = ft_adobe_glyph_list[table_offset] & 0x7f;
+        name_offset++;
+        table_offset++;
+        if (!(ft_adobe_glyph_list[table_offset - 1] & 0x80)) break;
+    }
+    glyph_name[name_offset] = 0;
+
+    // get child count
+    count = ft_adobe_glyph_list[table_offset] & 0x7f;
+
+    // check if we have value for this node
+    if (ft_adobe_glyph_list[table_offset] & 0x80) {
+        unsigned short thiscode = ft_adobe_glyph_list[table_offset + 1] * 256 + ft_adobe_glyph_list[table_offset + 2];
+        if (thiscode == (unsigned short)unicode)	// found it!
+            return 1;
+        table_offset += 3;
+    }
+    else
+        table_offset++;
+
+    // now search in sub-nodes
+    if (count == 0) return 0;
+    for (i = 0; i < count; i++) {
+        int child_offset = ft_adobe_glyph_list[table_offset + i * 2] * 256 + ft_adobe_glyph_list[table_offset + i * 2 + 1];
+        if (xyq_search_node(glyph_name, name_offset, child_offset, unicode))
+            // found in child
+            return 1;
+    }
+    return 0;
 }
 
 #define VARIANT_BIT         0x80000000UL
 
-int FXFT_unicode_from_adobe_name(const char*  glyph_name)
-{
-    /* If the name begins with `uni', then the glyph name may be a */
-    /* hard-coded unicode character code.                          */
-    if (glyph_name[0] == 'u' &&
-        glyph_name[1] == 'n' &&
-        glyph_name[2] == 'i')
-    {
-        /* determine whether the next four characters following are */
-        /* hexadecimal.                                             */
-
-        /* XXX: Add code to deal with ligatures, i.e. glyph names like */
-        /*      `uniXXXXYYYYZZZZ'...                                   */
-
-        FT_Int       count;
-        FT_UInt32    value = 0;
-        const char*  p = glyph_name + 3;
-
-
-        for (count = 4; count > 0; count--, p++)
-        {
-            char          c = *p;
-            unsigned int  d;
-
-
-            d = (unsigned char)c - '0';
-            if (d >= 10)
-            {
-                d = (unsigned char)c - 'A';
-                if (d >= 6)
-                    d = 16;
-                else
-                    d += 10;
-            }
-
-            /* Exit if a non-uppercase hexadecimal character was found   */
-            /* -- this also catches character codes below `0' since such */
-            /* negative numbers cast to `unsigned int' are far too big.  */
-            if (d >= 16)
-                break;
-
-            value = (value << 4) + d;
-        }
-
-        /* there must be exactly four hex digits */
-        if (count == 0)
-        {
-            if (*p == '\0')
-                return value;
-            if (*p == '.')
-                return (FT_UInt32)(value | VARIANT_BIT);
-        }
-    }
-
-    /* If the name begins with `u', followed by four to six uppercase */
-    /* hexadecimal digits, it is a hard-coded unicode character code. */
-    if (glyph_name[0] == 'u')
-    {
-        FT_Int       count;
-        FT_UInt32    value = 0;
-        const char*  p = glyph_name + 1;
-
-
-        for (count = 6; count > 0; count--, p++)
-        {
-            char          c = *p;
-            unsigned int  d;
-
-
-            d = (unsigned char)c - '0';
-            if (d >= 10)
-            {
-                d = (unsigned char)c - 'A';
-                if (d >= 6)
-                    d = 16;
-                else
-                    d += 10;
-            }
-
-            if (d >= 16)
-                break;
-
-            value = (value << 4) + d;
-        }
-
-        if (count <= 2)
-        {
-            if (*p == '\0')
-                return value;
-            if (*p == '.')
-                return (FT_UInt32)(value | VARIANT_BIT);
-        }
-    }
-
-    /* Look for a non-initial dot in the glyph name in order to */
-    /* find variants like `A.swash', `e.final', etc.            */
-    {
-        const char*  p = glyph_name;
-        const char*  dot = NULL;
-
-
-        for (; *p; p++)
-        {
-            if (*p == '.' && p > glyph_name)
-            {
-                dot = p;
-                break;
-            }
-        }
-
-        /* now look up the glyph in the Adobe Glyph List */
-        if (!dot)
-            return (FT_UInt32)ft_get_adobe_glyph_index(glyph_name, p);
-        else
-            return (FT_UInt32)(ft_get_adobe_glyph_index(glyph_name, dot) |
-            VARIANT_BIT);
-    }
-}
-
-void FXFT_adobe_name_from_unicode(char* glyph_name, wchar_t unicode)
-{
-    int i, count;
-
-    // start from top level node
-    count = ft_adobe_glyph_list[1];
-    for (i = 0; i < count; i++) {
-        int child_offset = ft_adobe_glyph_list[i * 2 + 2] * 256 + ft_adobe_glyph_list[i * 2 + 3];
-        if (xyq_search_node(glyph_name, 0, child_offset, unicode))
-            return;
-    }
-
-    // failed, clear the buffer
-    glyph_name[0] = 0;
-}
+int FXFT_unicode_from_adobe_name(const char*  glyph_name)
+{
+    /* If the name begins with `uni', then the glyph name may be a */
+    /* hard-coded unicode character code.                          */
+    if (glyph_name[0] == 'u' &&
+        glyph_name[1] == 'n' &&
+        glyph_name[2] == 'i')
+    {
+        /* determine whether the next four characters following are */
+        /* hexadecimal.                                             */
+
+        /* XXX: Add code to deal with ligatures, i.e. glyph names like */
+        /*      `uniXXXXYYYYZZZZ'...                                   */
+
+        FT_Int       count;
+        FT_UInt32    value = 0;
+        const char*  p = glyph_name + 3;
+
+
+        for (count = 4; count > 0; count--, p++)
+        {
+            char          c = *p;
+            unsigned int  d;
+
+
+            d = (unsigned char)c - '0';
+            if (d >= 10)
+            {
+                d = (unsigned char)c - 'A';
+                if (d >= 6)
+                    d = 16;
+                else
+                    d += 10;
+            }
+
+            /* Exit if a non-uppercase hexadecimal character was found   */
+            /* -- this also catches character codes below `0' since such */
+            /* negative numbers cast to `unsigned int' are far too big.  */
+            if (d >= 16)
+                break;
+
+            value = (value << 4) + d;
+        }
+
+        /* there must be exactly four hex digits */
+        if (count == 0)
+        {
+            if (*p == '\0')
+                return value;
+            if (*p == '.')
+                return (FT_UInt32)(value | VARIANT_BIT);
+        }
+    }
+
+    /* If the name begins with `u', followed by four to six uppercase */
+    /* hexadecimal digits, it is a hard-coded unicode character code. */
+    if (glyph_name[0] == 'u')
+    {
+        FT_Int       count;
+        FT_UInt32    value = 0;
+        const char*  p = glyph_name + 1;
+
+
+        for (count = 6; count > 0; count--, p++)
+        {
+            char          c = *p;
+            unsigned int  d;
+
+
+            d = (unsigned char)c - '0';
+            if (d >= 10)
+            {
+                d = (unsigned char)c - 'A';
+                if (d >= 6)
+                    d = 16;
+                else
+                    d += 10;
+            }
+
+            if (d >= 16)
+                break;
+
+            value = (value << 4) + d;
+        }
+
+        if (count <= 2)
+        {
+            if (*p == '\0')
+                return value;
+            if (*p == '.')
+                return (FT_UInt32)(value | VARIANT_BIT);
+        }
+    }
+
+    /* Look for a non-initial dot in the glyph name in order to */
+    /* find variants like `A.swash', `e.final', etc.            */
+    {
+        const char*  p = glyph_name;
+        const char*  dot = NULL;
+
+
+        for (; *p; p++)
+        {
+            if (*p == '.' && p > glyph_name)
+            {
+                dot = p;
+                break;
+            }
+        }
+
+        /* now look up the glyph in the Adobe Glyph List */
+        if (!dot)
+            return (FT_UInt32)ft_get_adobe_glyph_index(glyph_name, p);
+        else
+            return (FT_UInt32)(ft_get_adobe_glyph_index(glyph_name, dot) |
+            VARIANT_BIT);
+    }
+}
+
+void FXFT_adobe_name_from_unicode(char* glyph_name, wchar_t unicode)
+{
+    int i, count;
+
+    // start from top level node
+    count = ft_adobe_glyph_list[1];
+    for (i = 0; i < count; i++) {
+        int child_offset = ft_adobe_glyph_list[i * 2 + 2] * 256 + ft_adobe_glyph_list[i * 2 + 3];
+        if (xyq_search_node(glyph_name, 0, child_offset, unicode))
+            return;
+    }
+
+    // failed, clear the buffer
+    glyph_name[0] = 0;
+}
diff --git a/fpdfsdk/src/javascript/global.cpp b/fpdfsdk/src/javascript/global.cpp
index 906c737..39e6dc0 100644
--- a/fpdfsdk/src/javascript/global.cpp
+++ b/fpdfsdk/src/javascript/global.cpp
@@ -19,24 +19,24 @@
 
 // Helper class for compile-time calculation of hash values in order to
 // avoid having global object initializers.
-template <unsigned ACC, wchar_t... Ns>
-struct CHash;
-
-// Only needed to hash single-character strings.
-template <wchar_t N>
-struct CHash<N> {
-  static const unsigned value = N;
-};
-
-template <unsigned ACC, wchar_t N>
-struct CHash<ACC, N> {
-  static const unsigned value = (ACC * 1313LLU + N) & 0xFFFFFFFF;
-};
-
-template <unsigned ACC, wchar_t N, wchar_t... Ns>
-struct CHash<ACC, N, Ns...> {
-  static const unsigned value = CHash<CHash<ACC, N>::value, Ns...>::value;
-};
+template <unsigned ACC, wchar_t... Ns>
+struct CHash;
+
+// Only needed to hash single-character strings.
+template <wchar_t N>
+struct CHash<N> {
+  static const unsigned value = N;
+};
+
+template <unsigned ACC, wchar_t N>
+struct CHash<ACC, N> {
+  static const unsigned value = (ACC * 1313LLU + N) & 0xFFFFFFFF;
+};
+
+template <unsigned ACC, wchar_t N, wchar_t... Ns>
+struct CHash<ACC, N, Ns...> {
+  static const unsigned value = CHash<CHash<ACC, N>::value, Ns...>::value;
+};
 
 extern const unsigned int JSCONST_nStringHash =
   CHash<'s','t','r','i','n','g'>::value;
diff --git a/third_party/freetype/src/psaux/psaux.c b/third_party/freetype/src/psaux/psaux.c
index ec9ba7a..a4b9c5c 100644
--- a/third_party/freetype/src/psaux/psaux.c
+++ b/third_party/freetype/src/psaux/psaux.c
@@ -1,34 +1,34 @@
-/***************************************************************************/
-/*                                                                         */
-/*  psaux.c                                                                */
-/*                                                                         */
-/*    FreeType auxiliary PostScript driver component (body only).          */
-/*                                                                         */
-/*  Copyright 1996-2001, 2002, 2006 by                                     */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#define FT_MAKE_OPTION_SINGLE_OBJECT
-
-#include <ft2build.h>
-#include "psobjs.c"
-#include "psauxmod.c"
-#include "t1decode.c"
-#include "t1cmap.c"
-
-#ifndef T1_CONFIG_OPTION_NO_AFM
-#include "afmparse.c"
-#endif
-
-#include "psconv.c"
-
-
-/* END */
+/***************************************************************************/
+/*                                                                         */
+/*  psaux.c                                                                */
+/*                                                                         */
+/*    FreeType auxiliary PostScript driver component (body only).          */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2006 by                                     */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
+/*  this file you indicate that you have read the license and              */
+/*  understand and accept it fully.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+
+#include <ft2build.h>
+#include "psobjs.c"
+#include "psauxmod.c"
+#include "t1decode.c"
+#include "t1cmap.c"
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+#include "afmparse.c"
+#endif
+
+#include "psconv.c"
+
+
+/* END */
