zoukankan      html  css  js  c++  java
  • java导入ldif文件

    网上导入ldif文件的方式都是基于命令,或者相应工具如LDAP Browser Editor v2.8.2。

    但用java去实现这样的功能好像网上很少,于是我参照相应的开源代码并整理了一下,亲自测试通过,若有疑问欢迎留言!!!

    将ldap.jar导入到项目中

    LDIFReader.java

    package com.cn.ccc.ggg.ldap.core.common;
    
    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.util.ArrayList;
    import com.novell.ldap.LDAPAttribute;
    import com.novell.ldap.LDAPAttributeSet;
    import com.novell.ldap.LDAPControl;
    import com.novell.ldap.LDAPEntry;
    import com.novell.ldap.LDAPException;
    import com.novell.ldap.LDAPLocalException;
    import com.novell.ldap.LDAPMessage;
    import com.novell.ldap.LDAPModification;
    import com.novell.ldap.LDAPSearchResult;
    import com.novell.ldap.LDAPAddRequest;
    import com.novell.ldap.LDAPDeleteRequest;
    import com.novell.ldap.LDAPModifyDNRequest;
    import com.novell.ldap.LDAPModifyRequest;
    import com.novell.ldap.util.Base64;
    import com.novell.ldap.util.LDAPReader;
    
    /**
     * 处理inputStream对象以读取LDIF文件的类
     *
     * <p>该calss从LDIF文件读取LDAP条目和LDAP请求</p>
     *
     * <p>构造函数使用默认大小值8,192来创建 缓冲字符输入流并假定大小很大足以容纳下一个字段的dn字段和第一行当前正在阅读的LDIF文件中的第一条记录</p>
     *
     * <p>构造函数使用'1'作为默认的LDIF文件版本</p>
     */
    public class LDIFReader implements LDAPReader {
    
        private boolean            requestFile=true;          // request file=true
        private String             version;                   // LDIF file version
        private int                reqType;                   // int rep. of name
        private int                lNumber;                   // line number
        private int                dnlNumber;                  // dn line number
        private int                fNumber = 0;               // number of fields
        private byte[]             bytes= new byte[0];        // for any byte value
        private boolean            control = false;            // is control field
        private String             entryDN;                   // entry dn
        private String[]           modInfo;                   // for moddn
        private ArrayList          rFields = new ArrayList(); // record fields
        private ArrayList          cList = new ArrayList();   // control list
        private BufferedReader     bufReader;
        private LDAPControl[]      controls = null;           // req controls
        private LDAPEntry          currentEntry = null;
        private LDAPModification[] mods;
        private LDAPMessage        currentRequest = null;
    
        /**
         * 通过初始化LDIF_VERSION,isRequest构造LDIFReader对象,
         * InputStreamReader和BufferedReader
         *
         * @param in The InputStream object to be processed by LDIFReader
         */
        public LDIFReader( InputStream in )
                    throws IOException, LDAPLocalException
        {
            this( in, 1, 8192 );
            return;
        }
    
        /**
         * 通过初始化LDIF_VERSION,isRequest构造LDIFReader对象,
         * InputStreamReader和BufferedReader
         *
         * @param in The   Inputstream object to be processed by LDIFReader
         * @param version  The version currently used in the LDIF file
         */
        public LDIFReader( InputStream in, int version )
                    throws IOException, LDAPLocalException
        {
            this( in, version, 8192 );
            return;
        }
        /**
         * 通过初始化LDIF_VERSION,isRequest构造LDIFReader对象,
         * InputStreamReader和BufferedReader
         *
         * @param in The   Inputstream object to be processed by LDIFReader
         * @param version  The version currently used in the LDIF file
         * @param bufSize  The size used to create a buffering character-input
         *                 stream. The defaule value is 8,192.
         */
        public LDIFReader(InputStream in, int version, int bufSize)
                    throws IOException, LDAPLocalException
        {
    
            super();
    
            String line = null;
    
            if ( version != 1 ) {  // check LDIF file version
                throw new RuntimeException("com.novell.ldap.ldif_dsml.LDIFReader:"
                                  + "found: " + version + ", Should be: 1");
            }
    
            setVersion( version );
            InputStreamReader isr = new InputStreamReader(in, "US-ASCII");
            bufReader = new BufferedReader(isr);
    
            //为了确定它是否是LDIF内容文件或LDIF更改
            //文件,dn字段的第一行和旁边的有意义的行
            // dn字段被读入内存。
    
            //在版本行之前跳过前面的空行和注释行
           /* while( (line = bufReader.readLine())!= null &&
                   (line.length() == 0 || line.startsWith("#")) ) {
                this.lNumber++;
            }
    
            //已经到达文件的末尾
    
            if ( line == null ) {
                throw new LDAPLocalException(
                    "com.novell.ldap.ldif_dsml.LDIFReader:"
                        + " The file contains no LDIF info",
                            LDAPException.LOCAL_ERROR);
            }
    
           //需要增加行号
            this.lNumber++; //    1
    
          //第一个有效行(版本行)。 检查版本行
            
            if (line.startsWith("version:")) {
                this.version = line.substring("version:".length()).trim();
                if ( !this.version.equals( "1") ) {
                    throw new LDAPLocalException(
                        "com.novell.ldap.ldif_dsml.LDIFReader: "
                            + "version: found '" + version + "' (on line "
                                + this.lNumber + " of the file), should be '1'",
                                    LDAPException.LOCAL_ERROR);
                }
            }else { // 第一行有效行不是版本行
                throw new LDAPLocalException("com.novell.ldap.ldif_dsml.LDIFReader:"
                    + " Version line must be the first meaningful line(on line " +
                        this.lNumber + " of the file)",
                            LDAPException.LOCAL_ERROR);
            }
            */
    
            //    跳过版本行和之间的空行和注释行
            //    LDIF的第一个记录中的dn字段的第一行
            //    文件,读取第一条记录的dn字段的第一行
            do {
                //标记第一个dn行,所以我们以后可以回到这里
                bufReader.mark( bufSize );
                line=bufReader.readLine();
    
                if ( line == null) {  // end of file
                    throw new LDAPLocalException( "com.novell.ldap.ldif_dsml."
                        + "LDIFReader: the LDIF file only contains version line.",
                            LDAPException.LOCAL_ERROR);
                }
                this.lNumber++;
            } while((line.length()== 0) || line.startsWith("#"));
    
            //稍后会检查dn字段; 现在忽略了其余的一行
            // dn字段,并在dn字段后面读取有效行
            while ( (line = bufReader.readLine()) != null ) {
    
                // ! a part of dn field       ! a comment line
                if ( !line.startsWith(" ") && !line.startsWith("#") ) {
                    //到第一个记录的结尾
                     if ( line.length() == 0 ) {
                        //空行 这个记录只有dn字段
                        throw new LDAPLocalException("com.novell.ldap.ldif_dsml."
                            + "LDIFReader: the first record only has dn field(line "
                                + this.lNumber + " of the file)",
                                    LDAPException.LOCAL_ERROR);
                     }
                   //刚刚读取的行应该是开头的行
                   //'control', 'changetype', 属性名
                    break;
                }
            }
    
            if ( line == null) { // end of file
                throw new LDAPLocalException("com.novell.ldap.ldif_dsml."
                            + "LDIFReader: the first record only has dn field(line "
                                + this.lNumber + " of the file)",
                                    LDAPException.LOCAL_ERROR);
            }
    
            if(line.startsWith("changetype")||line.startsWith("control")){
                setRequest(true);  // LDIF使用LDAP操作请求更改文件
            }
            else {
                setRequest(false); // 带有LDAP条目的LDIF内容文件
            }
            
            setRequest(true);
            
            
            //返回到LDIF文件的第一个记录的开头
            //稍后读取可以从第一条记录开始
            bufReader.reset();
    
            //
            this.lNumber--;
            return;
        }
    
        /**
         * 获取与输入流相关联的LDIF数据的版本
         *
         * @return the version number
         */
        public String getVersion()
        {
            return version;
        }
    
        /**
         * 获取与输入流相关联的LDIF数据的版本
         *
         * @param value the version number
         */
        private void setVersion(int value)
        {
            version = String.valueOf(value);
            return;
        }
    
        /**
         * 如果请求数据与输入流相关联,则返回true,
         * 或如果内容数据为false。
         *
         * @return true if input stream contains request data.
         */
        public boolean isRequest()
        {
            return requestFile;
        }
    
        /**
         * 设置正在读取的文件的请求类型,如果请求数据为true
         * 或如果内容数据为false。
         *
         * @param type sets the type of file to content or request data.
         */
        private void setRequest( boolean type)
        {
            requestFile = type;
            return;
        }
    
        /**
         * 从LDIF请求(更改)文件或内容文件读取LDAP请求。.
         *
         * @return LDAPMessage specified by the record
         */
        public LDAPMessage readMessage()
                    throws IOException, LDAPException
        {
            readRecordFields();           // 读取记录字段
            if ( this.rFields == null ) { // 文件结尾
                return null;
            }
            toRecordProperties();         // 设置记录属性
    
    
            if (!isRequest()) {
                return new LDAPSearchResult(currentEntry, null);
            }
    
            switch( this.reqType ) {
                case LDAPMessage.SEARCH_RESPONSE :
                    this.currentRequest = new LDAPAddRequest(currentEntry, controls);
                    break;
                case LDAPMessage.ADD_REQUEST :
                    this.currentRequest = new LDAPAddRequest(currentEntry, controls);
                    break;
                case LDAPMessage.DEL_REQUEST :
                    this.currentRequest = new LDAPDeleteRequest(this.entryDN, controls);
                    break;
                case LDAPMessage.MODIFY_RDN_REQUEST :
                    boolean  delOldRdn;
    
                    if ( Integer.parseInt(this.modInfo[1]) == 1 ) {
                        delOldRdn = true;
                    } else {
                        delOldRdn = false;
                    }
    
                    if((modInfo[2].length())==0 ) {
                        this.currentRequest = new LDAPModifyDNRequest( this.entryDN,
                                         this.modInfo[0], null, delOldRdn, controls);
                    } else {
                        this.currentRequest = new LDAPModifyDNRequest(this.entryDN,
                             this.modInfo[0], modInfo[2], delOldRdn, controls);
                    }
                    break;
                case LDAPMessage.MODIFY_REQUEST :
                    this.currentRequest =
                              new LDAPModifyRequest(this.entryDN, mods, controls);
                    break;
                default:
            }
    
            return this.currentRequest;
        }
    
    
        /**
         * 读取当前记录中的所有行,将记录行转换为
         * 记录字段,并修剪记录字段中的多余空格。
         */
        private void  readRecordFields()
                    throws IOException, LDAPException
        {
    
            String line;
            StringBuffer bLine = new StringBuffer(80);
    
            // clean rFields
            this.rFields.clear();
    
            //跳过空和注释行并读取第一个dn
            //行记录
            while( (line = bufReader.readLine())!= null &&
                   (line.length() == 0 || line.startsWith("#")) ) {
                this.lNumber++;
            }
    
            this.lNumber++;
            this.dnlNumber = this.lNumber;
    
            if (line == null) { // 文件结尾
                this.rFields = null;
            }
            else {
                //检查dn行是否以'dn:'开头
                if (!line.startsWith("dn:")) {
                    throw new LDAPLocalException("com.novell.ldap.ldif_dsml." +
                        "LDIFReacer: Any record should start with 'dn:'(on line "
                            + this.lNumber + " of the file).",
                                LDAPException.LOCAL_ERROR);
                }
    
                //保存第一个dn行
                bLine.append(line);
    
                //读取除注释行之外的记录的其他行。
                //读取停止在用于分隔的空行
                //当前记录与下一个
                while ((line = bufReader.readLine())!=null && line.length()!=0 ) {
                    if ( !line.startsWith("#") ) {       //跳过注释行
                        if ( line.startsWith(" ") ) {    //续行?
                            // trim off leading ' ' and append it to previous line
                            bLine.append(line.substring(1, line.length()));
                        }
                        else { // 新的一行
                            // handle pewvious field
                            bLine = trimField(bLine);    // trime上一个字段
                            if(!this.control) {          // 如果不是,保存它
                                this.rFields.add(bLine); // 一个控制字段
                            }
                            //处理新行
                            bLine = new StringBuffer(80);// create a new buffer
                            bLine.append(line);          // to hold new line
                        }
                    }
                    this.lNumber++;
                }
                //修剪并保存最后一个字段
                bLine = trimField(bLine);
                this.rFields.add(bLine);
    
                this.lNumber++;                      // 增加行号
                this.fNumber = this.rFields.size();  // 获取字段数
            }
            return;
        }
    
    
        /**
         * 设置记录属性。
         * <p>对于LDIF内容记录,创建由此记录指定的LDAPEntry</p>
         *
         * <p>对于LDIF更改记录,根据请求类型,将创建LDAPEntry,modInfo或LDAPModifiction数组以及与请求相关联的控件</p>
         */
        private void toRecordProperties()
                    throws IOException, LDAPException
        {
    
            int index;
            String req;
    
            // set entry DN
            StringBuffer dnField = (StringBuffer)this.rFields.get(0);
            if (dnField.charAt(3) != ':') {
                // commom string value
                this.entryDN = dnField.substring( 3, dnField.length());
            }
            else {
                // base64 encoded
                this.bytes = Base64.decode(dnField, 4, dnField.length());
                try {
                    this.entryDN = new String(this.bytes, "UTF-8");
                } catch( UnsupportedEncodingException ue) {
                    throw new RuntimeException(
                        "UTF-8 String encoding not supported by JVM");
                }
            }
    
            if ( !isRequest() ) {  // 是一个内容LDIF文件
                toLDAPEntry();
            } else {  // 是一个更改LDIF文件
                index = 10; // length of 'changetype'
                // ctField - changetype field
                StringBuffer ctField = (StringBuffer)this.rFields.get(1);
    
                this.reqType = LDAPMessage.ADD_REQUEST;
                toLDAPEntry();
                
                
                /*if(!ctField.substring(0, index).equalsIgnoreCase("changetype")) {
                    throw new LDAPLocalException("com.novell.ldap.ldif_dsml."
                        +"LDIFReader: malformed changetype field in record starting"
                            + " on line " + this.dnlNumber + " of the file).",
                                LDAPException.LOCAL_ERROR);
                }
                // 获取类型: 'add', 'delete','moddn', 'modrdn', or 'modify'
                req = ctField.substring(index+1);
    
                // 设置请求类型
                if ( req.equalsIgnoreCase("add") ) {
                    this.reqType = LDAPMessage.ADD_REQUEST;
                    toLDAPEntry();
                }
                else if ( req.equalsIgnoreCase("delete") ) {
                    this.reqType = LDAPMessage.DEL_REQUEST;
                }
                else if ( req.equalsIgnoreCase("modrdn") ) {
                    this.reqType = LDAPMessage.MODIFY_RDN_REQUEST;
                    toModInfo();
                }
                else if ( req.equalsIgnoreCase("moddn") ) {
                    this.reqType = LDAPMessage.MODIFY_RDN_REQUEST;
                    toModInfo();
                }
                else if ( req.equalsIgnoreCase("modify") ) {
                    this.reqType = LDAPMessage.MODIFY_REQUEST;
                    toLDAPModifications();
                }
                else {
                    throw new LDAPLocalException("com.novell.ldap.ldif_dsml."
                        + "LDIFReader: unsupported request type '" + req
                        + "' specified in changetype filed of the record starting "
                        + "on line " + this.dnlNumber + " of the file.",
                        LDAPException.LOCAL_ERROR);
                }*/
    
    
                if (this.cList.size() > 0) {
                    this.controls = new LDAPControl[this.cList.size()];
                }
            }
            return;
        }
    
    
        /**
         * 处理LDIF记录字段以生成LDAPEntry。
         */
        private void toLDAPEntry()
                    throws LDAPLocalException
        {
            int i, index, fieldIndex;
            String attrName = null;
            StringBuffer currentField;
            LDAPAttributeSet attrSet = new LDAPAttributeSet();
    
            if ( !isRequest() ) { // 跳过 dn 字段
                fieldIndex = 0;
            }
            else { // 跳过dn,control和changetype字段
                fieldIndex = 1;
            }
    
            for (i=fieldIndex; i<this.fNumber; i++) {
                currentField = (StringBuffer)this.rFields.get(i);
                // ':' 分离属性名称和属性值
                index = IndexOf(currentField, ':');
                if (index == -1) { // ':' not found
                    throw new LDAPLocalException("com.novell.ldap.ldif_dsml."
                        + "LDIFReader: missing ':' after attribute name in record "
                            + "starting on line " + this.dnlNumber +" of the file.",
                                LDAPException.LOCAL_ERROR);
                }
    
                // 获取属性名称
                attrName = currentField.substring(0,index);
                // 如果属性名称不存在,则添加 
                if ( attrSet.getAttribute(attrName) == null ) {
                    // add it to attrSet with no value
                    attrSet.add(new LDAPAttribute(attrName));
                }
    
                if(currentField.length() > index+1){
                    // 将属性值添加到属性中
                    if (currentField.charAt(index+1)==':') {
                        // base64编码的属性值
                        attrSet.getAttribute(attrName).addBase64Value(currentField. substring(index+2));
                    } else if (currentField.charAt(index+1)=='<'){
                        // 文件URL属性值
                        attrSet.getAttribute(attrName).addBase64Value(currentField. substring(index+2));
                    } else {
                        // 字符串值
                        String vals=currentField.substring(index+1).trim();
                        attrSet.getAttribute(attrName).addValue(vals);
    //                  attrSet.getAttribute(attrName).addValue(currentField.
    //                                                           substring(index+1));
                    }
                } else if(currentField.length() == index+1){
                    String vals=new String("");
                    attrSet.getAttribute(attrName).addValue(vals);
                }
    
            }
            // 构造currentEntry
            this.currentEntry = new LDAPEntry(this.entryDN, attrSet);
            return;
        }
    
    
        /**
         * 构建包含moddn信息的String数组对象。
         */
        private void toModInfo() throws LDAPLocalException {
    
            int index = 6;      // length of "newrdn"
            int fieldIndex = 2; // reference newrdn field
            this.modInfo = new String[3];
            StringBuffer currentField = (StringBuffer)this.rFields.get(fieldIndex);
    
    
    
            if( ! currentField.substring(0, index+1).equalsIgnoreCase("newrdn:")) {
                 throw new LDAPLocalException("com.novell.ldap.ldif_dsml.LDIFReader:"
                     + " malformed newrdn field in record starting on line "
                     + this.dnlNumber + " of the file.", LDAPException.LOCAL_ERROR);
            }
    
            // get newrdn
            if ( currentField.charAt(index+1) != ':') {
                // common string value
                this.modInfo[0] = currentField.substring(index+1);
            }
            else {
                // decode newrdn
                this.bytes = Base64.decode( currentField, index+2,
                                                            currentField.length());
                try {
                    this.modInfo[0] = new String(this.bytes, "UTF-8");
                } catch( UnsupportedEncodingException ue) {
                    throw new RuntimeException(
                        "UTF-8 String encoding not supported by JVM");
                }
            }
    
            fieldIndex++;   // reference deleteOleRDN field
            index = 13;     // length of "deleteoldrdn"
            currentField = (StringBuffer)this.rFields.get(fieldIndex);
    
            if( ! currentField.substring(0, index).equalsIgnoreCase(
                                                               "deleteoldrdn:") ) {
                throw new LDAPLocalException("com.novell.ldap.ldif_dsml.LDIFReader:"
                    + " malformed deleteoldrdn field in record starting on line "
                    + this.dnlNumber + " of the file.", LDAPException.LOCAL_ERROR);
            }
    
            char c = currentField.charAt(index);
            if (c == '1') {
                this.modInfo[1] = new String("1");
            }
            else if (c == '0'){
                this.modInfo[1] = new String("0");
            }
            else {
                throw new LDAPLocalException("com.novell.ldap.ldif_dsml.LDIFReader:"
                   + " value for deleteoldrdn field should '0' or '1', found '" + c
                   + "' in the record starting on line " + this.dnlNumber
                   + " of the file.", LDAPException.LOCAL_ERROR);
            }
    
            fieldIndex++;   // reference newsuperior field
            
            if (fieldIndex == this.fNumber) { // no newsuperior spefified
                this.modInfo[2] = new String("");
            }
            else { // there is a newsuperior
                currentField = (StringBuffer)this.rFields.get(fieldIndex);
                index = 12;   // length of "newsuperior:"
                if( ! currentField.substring(0, index).equalsIgnoreCase(
                                                                 "newsuperior:")) {
                    throw new LDAPLocalException("com.novell.ldap.ldif_dsml."
                        + "LDIFReader: malformed newsuperior field in the record "
                        + "starting on line " + this.dnlNumber + " of the file.",
                        LDAPException.LOCAL_ERROR);
                }
    
                if ( currentField.charAt(index) != ':') {
                    // commom string value
                    this.modInfo[2] = currentField.substring(index);
                }
                else {
                    // base64 encoded value
                    this.bytes = Base64.decode( currentField, index+1,
                                                           currentField.length());
                    this.modInfo[2] = new String(this.bytes);;
                }
            }
            return;
        }
    
        /**
         * 基于LDIF修改记录的内容构建LDAPModification数组。
         */
        private void toLDAPModifications()throws LDAPLocalException{
    
            int        i, index;
            int        fieldIndex = 2;    // 跳过 dn, control, and changetype 字段
            String     attrName, opName;
            LDAPAttribute attr = null;
            ArrayList modList = new ArrayList();
    
            if (!(this.rFields.get(this.fNumber-1)).toString().
                                                          equalsIgnoreCase("-") ) {
                throw new LDAPLocalException("com.novell.ldap.ldif_dsml."
                      + "LDIFReader: modify record not ends with '-' in the record"
                      + " starting on line " + this.dnlNumber + " of the file.",
                        LDAPException.LOCAL_ERROR);
            }
    
            // 填充LDAPModification数组对象
            for (i=fieldIndex; i<this.fNumber; i++) {
                // 找到":"分开mod操作和attr名称
                index = IndexOf((StringBuffer)this.rFields.get(i), ':');
                if (index == -1) { // ':' not found
                    throw new LDAPLocalException("com.novell.ldap.ldif_dsml."
                       + "LDIFReader: malformed opName:attrName field in the record"
                       + " starting on line " + this.dnlNumber + " of the file.",
                        LDAPException.LOCAL_ERROR);
                }
    
                StringBuffer nextField = (StringBuffer)this.rFields.get(i);
                opName= nextField.substring(0, index);
                attrName= nextField.substring(index+1);
    
                i++; // 指向attrName:attrValue字段
                nextField = (StringBuffer)this.rFields.get(i);
    
                // 构建每个LDAPModification对象并将其添加到modList
                if (nextField.charAt(0)!='-') {
                    // 至少有一个 属性名称:属性值 字段
                    for ( ; nextField.charAt(0)!='-';
                            i++, nextField = (StringBuffer)this.rFields.get(i)) {
                        // 下标分离属性名称和属性值
                        if ((index=IndexOf(nextField, ':')) == -1) {
                            throw new LDAPLocalException("com.novell.ldap."
                                + "ldif_dsml.LDIFReader : no ':' found in attrName:"
                                + "attrValue field in the record starting on line "
                                + this.dnlNumber + " of the file.",
                                LDAPException.LOCAL_ERROR);
                        }
                        else {
                            // 比较opName:attrName和 attrName:attrValue字段
                            String aName = nextField.substring(0, index);
                            if (!aName.equalsIgnoreCase(attrName)) {
                                throw new LDAPLocalException("com.novell.ldap."
                                + "ldif_dsml.LDIFReader : found attribute name '"
                                + aName + "', should be '" + attrName
                                + "' in attrName:attrValue field in the record "
                                + "starting on line " + this.dnlNumber
                                + " of the file.", LDAPException.LOCAL_ERROR);
                            }
    
                            // create attr and add value to it
                            attr = new LDAPAttribute(attrName);
                            if (nextField.charAt(index+1)==':') {
                                // base64 encoded attribute value
                                attr.addBase64Value(nextField.substring(index+2));
                            }
                            else if (nextField.charAt(index+1)=='<'){
                                // file URL attribute value
                                attr.addBase64Value(nextField.substring(index+2));
                            }
                            else {
                                // string value
                                attr.addValue(nextField.substring(index+1));
                            }
    
    
                            if ( opName.equalsIgnoreCase("add") ) {
                                modList.add( new LDAPModification(
                                                      LDAPModification.ADD, attr));
                            }
                            else if ( opName.equalsIgnoreCase("delete") ) {
                                modList.add( new LDAPModification(
                                                   LDAPModification.DELETE, attr));
                            }
                            else if ( opName.equalsIgnoreCase("replace") ) {
                                modList.add( new LDAPModification(
                                                  LDAPModification.REPLACE, attr));
                            }
                            else {
                                throw new LDAPLocalException("com.novell.ldap."
                                    + "ldif_dsml.LDIFReader : Not supported modify "
                                    + " request (" + opName + ") specified in "
                                    + "record starting on line " + this.dnlNumber
                                    + " of the file.", LDAPException.LOCAL_ERROR);
                            }
                        }
                    }
                } else {
                    // there is no attribute value specified; this could be
                    // true for 'delete' and 'replace' modify operation
                    attr = new LDAPAttribute(attrName);
    
                    if ( opName.equalsIgnoreCase("delete") ) {
                        modList.add( new LDAPModification(
                                                   LDAPModification.DELETE, attr));
                    }
                    else if ( opName.equalsIgnoreCase("replace") ) {
                        modList.add( new LDAPModification(
                                                  LDAPModification.REPLACE, attr));
                    }
                    else {
                        throw new LDAPLocalException("com.novell.ldap.ldif_dsml."
                            + "LDIFReader: For '" + opName + "', no value "
                            + "specified for atribute '" + attrName
                            + "' in the record starting on line "
                            + this.dnlNumber + " of the file.",
                            LDAPException.LOCAL_ERROR);
                    }
                }
            }
            this.mods = new LDAPModification[modList.size()];
            this.mods = (LDAPModification[])modList.toArray(this.mods);
            return;
        }
    
        /**
         * 返回指定字符首次出现的StringBuffer对象内的索引。
         *
         * @param bl  The StringBuffer object
         * @param ch   The character to look for in the StringBuffer object
         *
         * @return The index of the first occurence of the character in the
         * StringBuffer object, or -1 if the character does not occur.
         */
        private int IndexOf(StringBuffer bl, int ch)
        {
    
            if (bl != null ) {
                for (int i=0;i<bl.length(); i++) {
                    if(bl.charAt(i) == ch) {
                        return i;
                    }
                }
            }
            return -1;
        }
    
    
        /**
         * <tt>去空字段<tt> 修剪一个字段中的多余空格。
         */
        private StringBuffer trimField( StringBuffer line)
                    throws LDAPLocalException
        {
            int c, lastChar = 0, charIndex = 0;
            char t;
            char[] newChars;
            boolean isEncoded=false, isURL=false, criticality = false;
            String oid = null;
    
            if ((line == null)||((c=IndexOf(line,':'))==-1)) {
                // not all fields contain ':'
                return line;
            }
    
            // elminate any trailing spaces
            lastChar = line.length() - 1;
            while( line.charAt(lastChar) == ' ') {
                lastChar--;
            }
    
            // create newChars
            newChars = new char[lastChar+1];
    
            if( (c > 6) && (line.substring(0,c).equals("control"))) {
                // this is a control field
                this.control = true;
                c++;            // skip past ':'
                // eliminate any spaces after ':'
                while( (c <= lastChar) && (line.charAt(c) == ' ')) {
                    c++;
                }
            }
            else {
                // not a control field. it's 'dn',
                //'changetype', or 'attrName' field
                this.control = false;
    
                // copy field name and ':', eg. 'dn:', 'changetype:', or 'attrName:'
                line.getChars(0, c+1, newChars, 0);
                // skip over copied chars
                charIndex += c + 1;
                // c points to char right after first ':'
                c++;
            }
    
            if(!this.control) {
                // // not a control field. check if '::' or ':<'
                if( c <= lastChar) {
                    t = line.charAt(c);
                    if( t == ':') {
                        newChars[charIndex++] = ':'; // save the ':' to
                        c++;                         // point to value
                    }
                    else if( t == '<') {
                        newChars[charIndex++] = '<'; // save the '<' to
                        c++;                         // point to value
                    }
                }
    
                // for case like attr: <value>
                boolean nonfile=false;
                String fredir= line.substring(c);            
                if(fredir.length()>0 && fredir.charAt(0) != '<'){
                         String cstr=fredir.trim();
                         if(cstr.length()>0 && cstr.charAt(0) == '<'){
                              nonfile=true;
                         }
                    }
                    
                // eliminate any space(s) after ':' or '<'
                while( (c <= lastChar) && (line.charAt(c) == ' ')) {
                    c++;
                }
                
                // for case like attr: <value>            
                if(nonfile==true){
                    c--;
                }
                
    
                if( c <= lastChar) {  // thers is a value specified
                    // copy field value
                    line.getChars(c, lastChar+1, newChars, charIndex);
    
                    charIndex += lastChar - c + 1;
                    // create a new StringBuffer object with capacity of lastChar
                    StringBuffer newBuf = new StringBuffer(lastChar);
                    // copy the filed represented by newChars
                    newBuf.append( newChars, 0, charIndex);
                    // return the trimed field
                    return newBuf;
                }
                else if ( line.length() == c){
                    StringBuffer newBuf= new StringBuffer();
                    line.getChars(c, lastChar+1, newChars, charIndex);
                    charIndex += lastChar - c + 1;
                    newBuf.append( newChars, 0, charIndex);    
                    return newBuf;
                }
                
                else {  // there is no value specified
                    throw new LDAPLocalException("com.novell.ldap.ldif_dsml."
                            + "LDIFReader: a field contains no value after ':'. the "
                            + "field is in the record starting on line "
                            + this.dnlNumber + " of the file.",
                            LDAPException.LOCAL_ERROR);
                }
            }
            else {  // a control field
                // process values for control. a control field may looks like
                //    1. control: 1.2.3.4 true: control value
                //    2. control: 1.2.3.4: control value
                //    3. control: 1.2.3.4
                // extra spaces are possible between oid, criticality, and value.
                // oid is a must, while criticalitty and value can be absent.
    
                // get control oid
                int b = c;
                while(c <= lastChar) {
                    // an oid consists of dots and digits
                    t = line.charAt(c);
                    if( (t == '.') || (Character.isDigit(t))) {
                        c++;
                        continue;
                    }
                    break;
                }
    
                if( b == c) {  // control with no oid
                    throw new LDAPLocalException("com.novell.ldap.ldif_dsml."
                        + "LDIFReader: Control with no oid in the record "
                            + "starting on line " + this.dnlNumber
                            + " of the file.", LDAPException.LOCAL_ERROR);
                }
                else {  // control has iod, get local copy of oid
                    char[] chars = new char[c-b];
                    line.getChars(b, c, chars, 0);
                    oid = new String(chars);
                }
    
                if ( c > lastChar) {
                    // control only has an oid. create LDAPControl object
                    // with oid, 'false' and empty byte array
                    LDAPControl ctrl = new LDAPControl(oid, false, new byte[0]);
                    // add it to cList
                    this.cList.add(ctrl);
                    return null;  // return value has no use
                }
    
                // get control criticality
                t = line.charAt(c);
                if( t == ' ') {
                    // see a space, skip over any spaces
                    while( (c <= lastChar) && (line.charAt(c) == ' ')) {
                        c++;
                    }
                }
                // what we see now? 'true', 'false', or ':' ?
                if(((c + 3) <= lastChar)&&(line.substring(c,c+4).equals("true"))) {
                    // found 'true'
                    c += 4;
                    criticality = true;
                }
                else if(((c+4)<=lastChar)&&(line.substring(c,c+5).equals("false"))){
                    // found 'false'
                    c += 5;
                    criticality = false;
                }
    
                if (c > lastChar) {  // to the end of the control field
                    // create LDAPControl object with oid,
                    // criticality, and empty byte array
                    LDAPControl ctrl=new LDAPControl(oid, criticality, new byte[0]);
                    // add it to cList
                    this.cList.add(ctrl);
                    return null;
                }
    
                if ((t=line.charAt(c)) != ':') {
                    throw new LDAPLocalException("com.novell.ldap.ldif_dsml."
                            + "LDIFReader: Unexcepted char '" + t + "'. Expecting "
                            + "to see ':' in the record starting on line "
                            + this.dnlNumber + " of the file.",
                            LDAPException.LOCAL_ERROR);
                }
    
                // get control value
                c++;  // go to enst char after ':'
                if (c > lastChar) {
                    throw new LDAPLocalException("com.novell.ldap.ldif_dsml."
                        + "LDIFReader: No control value after ':' "
                        + "in the record starting on line "
                        + this.dnlNumber + " of the file.",
                        LDAPException.LOCAL_ERROR);
                }
    
                // positioned at the first char right after ':'
                // check if '::' or ':<'
                t = line.charAt(c);
                if( t == ':') {
                    isEncoded = true;            // indicate encoded value
                    c++;                         // point to value
                    if (c > lastChar) {
                        throw new LDAPLocalException("com.novell.ldap.ldif_dsml."
                            + "LDIFReader: No control value after '::' "
                            + "in the record starting on line "
                            + this.dnlNumber + " of the file.",
                            LDAPException.LOCAL_ERROR);
                    }
                }
                else if( t == '<') {
                    isURL = true;                // indicate file URL value
                    c++;                         // point to value
                    if (c > lastChar) {
                        throw new LDAPLocalException("com.novell.ldap.ldif_dsml."
                            + "LDIFReader: No control value after ':<' "
                            + "in the record starting on line "
                            + this.dnlNumber + " of the file.",
                            LDAPException.LOCAL_ERROR);
                    }
                }
    
                // eliminate any space(s) after ':', '::' or ':<'
                while((c <= lastChar) && (line.charAt(c) == ' ')) {
                    c++;
                }
    
                if(c <= lastChar) {  // thers is a value spec specified
                    char[] chars = new char[lastChar+1-c];
                    line.getChars(c, lastChar+1, chars, 0);
    
                    if (isEncoded) {
                        this.bytes = Base64.decode(chars);
                    }
                    else if (isURL) {
                        // if isURL, what to do?
                        this.bytes = (new String(chars)).getBytes();
                    }
                    else {
                        this.bytes = (new String(chars)).getBytes();
                    }
                }
                // create LDAPControl object
                LDAPControl ctrl = new LDAPControl(oid, criticality, this.bytes);
                // add it to cList
                this.cList.add(ctrl);
            }
            return null;
        }
    }

    LdifImport.java 完整代码

    package com.cn.ccc.ggg.ldap.core.common;
    
    import java.util.Enumeration;
    
    import java.util.Iterator;
    
    import javax.naming.directory.DirContext;
    
    import org.apache.commons.io.IOUtils;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.apache.directory.server.protocol.shared.store.LdifFileLoader;
    
    import com.novell.ldap.LDAPAddRequest;
    import com.novell.ldap.LDAPAttribute;
    import com.novell.ldap.LDAPAttributeSet;
    import com.novell.ldap.LDAPConnection;
    import com.novell.ldap.LDAPDeleteRequest;
    import com.novell.ldap.LDAPEntry;
    import com.novell.ldap.LDAPException;
    import com.novell.ldap.LDAPMessage;
    import com.novell.ldap.LDAPMessageQueue;
    import com.novell.ldap.LDAPModifyDNRequest;
    import com.novell.ldap.LDAPModifyRequest;
    import com.novell.ldap.LDAPResponse;
    import com.novell.ldap.LDAPSearchResult;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.UnsupportedEncodingException;
    
    
    public class LdifImport {
        
        protected final Log logger = LogFactory.getLog(getClass());
       /**
         * @param args
         * @date 2017‎年‎10‎月‎12‎日17:33:03
         */
        public boolean importLdif(String [] args){
            if (args.length != 4) {
                usage();
                return false;
            }
            int  version = 1;
            int ldapPort = LDAPConnection.DEFAULT_PORT;
            int ldapVersion  = LDAPConnection.LDAP_V3;
            String fileName = args[0];
            String ldapHost = args[1];
            String loginDN  = args[2];
            String password = args[3];
            LDIFReader reader = null;
            LDAPEntry entry;
            LDAPMessage msg, retMsg;
            LdifImport readerTest = new LdifImport();
            LDAPConnection lc = new LDAPConnection();
            File file = new File(fileName);  
            if(!file.exists()){  
                logger.error("要读取的文件不存在");  
                return false;
            }  
            try {
                FileInputStream fis = new FileInputStream(new File(fileName));
                reader = new LDIFReader(fis, version);
            } catch (Exception e) {
                logger.error("读取 " + fileName +"文件失败");
                return false;
            }
            try {
                // 连接LDAP服务
                lc.connect( ldapHost, ldapPort );
                // 绑定LDAP服务
                lc.bind( ldapVersion, loginDN, password.getBytes("UTF8") );
                
                if (!reader.isRequest()) {
    
                    System.out.println("
    LDIF content file
    ");
    
    
    
                    while ( (msg = reader.readMessage()) != null) {
    
                        entry = ((LDAPSearchResult)msg).getEntry();
    
                        System.out.println("
    Entry DN:" + entry.getDN());
    
                        readerTest.showAttributes(entry);
    
                    }
    
                }
    
                else {
    
                    System.out.println("
    LDIF change file
    ");
    
    
    
                    while ( (msg = reader.readMessage()) != null) {
    
                        if (msg instanceof LDAPAddRequest) {
    
                           System.out.println("Adding entry...");
    
                        }
    
                        else if (msg instanceof LDAPDeleteRequest) {
    
                            System.out.println("Deleting entry...");
    
                        }
    
                        else if (msg instanceof LDAPModifyDNRequest) {
    
                            System.out.println("Modifying entry's RDN...");
    
                        }
    
                        else if (msg instanceof LDAPModifyRequest) {
    
                            System.out.println("Modifying entry's attribute(s)...");
    
                        }
    
    
    
                        LDAPMessageQueue queue = lc.sendRequest(msg, null, null);
    
                        if ((retMsg = queue.getResponse()) != null) {
    
                            LDAPResponse response = (LDAPResponse)retMsg;
    
                            int status = response.getResultCode();
    
    
    
                           // the return code is LDAP success
    
    
                            if ( status == LDAPException.SUCCESS ) {
    
                                System.out.println("Directory information has been"
    
                                                                   + " modified.");
    
                            }
    
                           // the reutrn code is referral exception
    
    
                            else if ( status == LDAPException.REFERRAL ) {
    
                                String urls[]=((LDAPResponse)retMsg).getReferrals();
    
                                System.out.println("Referrals:");
    
                                for ( int i = 0; i < urls.length; i++ )
    
                                    System.out.println("    " + urls[i]);
    
                            }
    
                           // general error
    
    
                            else {
    
                                System.out.println( response.getErrorMessage());
    
                            }
    
                        }
    
                        System.out.println();
    
                    }
    
                }
    
                
            } catch( UnsupportedEncodingException e ) {
                logger.error( "错误信息为:UnsupportedEncodingException");
            } catch ( IOException ioe ) {
                logger.error("错误信息为:IOException");
            } catch ( LDAPException le ) {
                logger.error("错误信息为:LDAPException"+le.getMessage());
            }
            return false;
        }
        
        public  void usage() {
    
            logger.error("用法:   <文件名称>     <IP> <登录名> <密码>");
            logger.error("例如: demo.ldif  192.168.0.254 "cn=Manager,c=中华人民共和国" 123456" );
    
        }
        
        public void showAttributes(LDAPEntry entry) {
    
    
    
            String value;
    
            LDAPAttributeSet as = null;
    
            LDAPAttribute[]  attrs = null;
    
            LDAPAttribute attr = null;
    
            Iterator allAttrs;
    
            Enumeration allAttrValues;
    
    
    
            as = entry.getAttributeSet();
    
            allAttrs = as.iterator();
    
            System.out.println("    Attributes:");
    
            while(allAttrs.hasNext()) {
    
                attr = (LDAPAttribute)allAttrs.next();
    
                System.out.println("        " + attr.getName());
    
                allAttrValues = attr.getStringValues();
    
                if( allAttrValues != null) {
    
                    while(allAttrValues.hasMoreElements()) {
    
                        value = (String) allAttrValues.nextElement();
    
                        System.out.println("            " + value);
    
                    }
    
                }
    
            }
    
        }
        
        public static void main(String[] args) {
            LdifImport ldifImport = new LdifImport();
            String[] arg = {"C:/Users/Administrator/Desktop/Ldif Datacenter/dq.ldif","192.168.0.254","cn=Manager,c=cn","123456"};
            //测试导入ldif文件
            ldifImport.importLdif(arg);
            
        }
    }

    dq.ldif文件内容为:

    dn:: bz3mtbfljZfnnIHkurrmsJHmlL/lupzlip7lhazljoUsIGM9Y24=
    objectClass: organization
    o:: 5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6F
    
    dn:: b3U955S15a2Q5pS/5Yqh5Yqe5YWs5a6kLG895rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs
     5Y6FLCBjPWNu
    ou:: 55S15a2Q5pS/5Yqh5Yqe5YWs5a6k
    objectClass: organizationalUnit
    
    dn:: Y24955yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf57uT54K56K6k6K+B57O757ufLG91PeeU
     teWtkOaUv+WKoeWKnuWFrOWupCxvPea1t+WNl+ecgeS6uuawkeaUv+W6nOWKnuWFrOWOhSwgYz1j
     bg==
    EncryptnotAfter: 20200614115959DE2MDAwMFoXDTIwMDYxNDE1NTk1OVowgdgxHjAcBgNVBAY
     MFeS4reWNjuS6uuawkeWFseWSjOWbvTESMBAGA1UECAwJ5rW35Y2X55yBMScwJQYDVQQKDB7mtbf
     ljZfnnIHkurrmsJHmlL/lupzlip7lhazljoUxHjAcBgNVBAsMFeeUteWtkOaUv+WKoeWKnuWFrOW
     upDE2MDQGA1UEAwwt55yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf57uT54K56K6k6K+B57O757u
     fMSEwHwYJKoZIhvcNAQkBDBJsaXhpb25nQGJndC5obi5nb3YwdjAQBgcqhkjOPQIBBgUrgQQAIgN
     iAARuWaJE4jO7gBZypBzQUYBjqtqGn/JGG7om2H8T7uz9SZcaIfL+h5Lu75pyN5Yqh57O757uf6L
     qr5Lu96K6k6K+B57O757ufMSIwIAYJKoZIhvcNAQkBDBNsaXV4aW9uZ0BiZ3QuaG4uZ292MHYwEA
     YHKoZIzj0CAQYFK4EEACIDYgAEU5G7LIzuFQ+8oEws7Nrd8ArCwdNxPbGoiAxjgiE6J8L8+6Y5Ny
     CxbxQQcHKnWmkqtT8QEm6HRpHyOFTh4O+fWIWuQNWuHeDhuLX9t4fkbqX9cB61RMIOkuSYdyNM1c
     9aow8wDTALBgNVHQ8EBAMCA/gwCwYJKoEcgUUBh2gLA2EANefwg7k63w7RlirMG5TPq2hs5yG2hJ
     1k4r0v2P/59BpPUwzIEUAxsp8HtSNus/qY4q5jrR0ZvhrNdwFN8pEZyfrW+hPOQ2rnznceid3upU
     oxOWlyJQx++iTGuJiwKccm
    objectClass: wstCertificateUser
    cn:: 55yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf57uT54K56K6k6K+B57O757uf
    
    dn:: Y24955yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf6LWE5rqQ6K6/6Zeu5o6n5Yi2572R5YWz
     MSxvdT3nlLXlrZDmlL/liqHlip7lhazlrqQsbz3mtbfljZfnnIHkurrmsJHmlL/lupzlip7lhazl
     joUsIGM9Y24=
    EncryptCertificate;binary:: MIICrjCCAjqgAwIBAgIDAO/3MAsGCSqBHIFFAYdoCzCBpDE2M
     DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
     AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
     gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
     DE2MDAwMFoXDTIwMDYxNDE1NTk1OVowgdAxHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
     TESMBAGA1UECAwJ5rW35Y2X55yBMRIwEAYDVQQHDAnmtbflj6PluIIxJzAlBgNVBAoMHua1t+WNl
     +ecgeS6uuawkeaUv+W6nOWKnuWFrOWOhTEeMBwGA1UECwwV55S15a2Q5pS/5Yqh5Yqe5YWs5a6kM
     T0wOwYDVQQDDDTnnIHmlL/lupzkv6Hku7vmnI3liqHns7vnu5/otYTmupDorr/pl67mjqfliLbnv
     ZHlhbMxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEJdbjSFVH/qJ7mn9OvRfFJcv5meB13NOZft5ck
     ZzLEFdzCc8ABw8V1v0x+l6tRGrsbhEvlwWDZqLg8G/O8Vs4TKqbNceWb3JjY6xBMeUbx2BDDKMuN
     3r43/YbscmFJvXLow8wDTALBgNVHQ8EBAMCA/gwCwYJKoEcgUUBh2gLA2EAbdWEWguIXMhU1bIiJ
     pPttbL7fjCDIsa32Pu8eKKsEnICQHwowrVkjzq1r/3ml5KTK+3ggglwFMNveMrTGByG9VrjiQ1ot
     +5mrespR2FLADGdVdKxJ3clmeq27g7pgSRj
    EncryptnotAfter: 20200614115959
    objectClass: wstCertificateUser
    EncryptserialNumber: EFF7
    cn:: 55yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf6LWE5rqQ6K6/6Zeu5o6n5Yi2572R5YWzMQ==
    
    dn:: Y24955yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf6LWE5rqQ6K6/6Zeu5o6n5Yi2572R5YWz
     MixvdT3nlLXlrZDmlL/liqHlip7lhazlrqQsbz3mtbfljZfnnIHkurrmsJHmlL/lupzlip7lhazl
     joUsIGM9Y24=
    EncryptCertificate;binary:: MIICrjCCAjqgAwIBAgIDAO/4MAsGCSqBHIFFAYdoCzCBpDE2M
     DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
     AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
     gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
     DE2MDAwMFoXDTIwMDYxNDE1NTk1OVowgdAxHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
     TESMBAGA1UECAwJ5rW35Y2X55yBMRIwEAYDVQQHDAnmtbflj6PluIIxJzAlBgNVBAoMHua1t+WNl
     +ecgeS6uuawkeaUv+W6nOWKnuWFrOWOhTEeMBwGA1UECwwV55S15a2Q5pS/5Yqh5Yqe5YWs5a6kM
     T0wOwYDVQQDDDTnnIHmlL/lupzkv6Hku7vmnI3liqHns7vnu5/otYTmupDorr/pl67mjqfliLbnv
     ZHlhbMyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEFDAcXvDayxxmC8Z1zxeKulVd+jLgw+Ai1UQ2y
     kHBX8K+qTYQehzIRQiMrfx7BN0MnhtWS3A3x7MGmYcV1f9KAfwabk99eLGMhVPqaMpvvDs8r7PIo
     hZGD6fy4YTz/YXqow8wDTALBgNVHQ8EBAMCA/gwCwYJKoEcgUUBh2gLA2EAqGtm6vCYADU+sGn73
     vvAKt53vPRkQvrummU01afdawwJMBR+GQmNdkuMo+cYI2Jl+5z3K2wgcfKoFzBsxR7+ldFAlfw4v
     xHRFOwHzgxo6TvkiL6kSHi6WGN0kFuvJ2rS
    EncryptnotAfter: 20200614115959
    objectClass: wstCertificateUser
    EncryptserialNumber: EFF8
    cn:: 55yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf6LWE5rqQ6K6/6Zeu5o6n5Yi2572R5YWzMg==
    
    dn:: b3U95bqU5oCl5YqeLG895rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FLCBjPWNu
    ou:: 5bqU5oCl5Yqe
    objectClass: organizationalUnit
    
    dn:: Y249546L5oyv5a6HLG91PeW6lOaApeWKnixvPea1t+WNl+ecgeS6uuawkeaUv+W6nOWKnuWF
     rOWOhSwgYz1jbg==
    notAfter: 20200614115959
    EncryptCertificate;binary:: MIICcTCCAf2gAwIBAgIDAO/5MAsGCSqBHIFFAYdoCzCBpDE2M
     DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
     AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
     gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
     DE2MDAwMFoXDTIwMDYxNDE1NTk1OVowgY8xHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
     TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMRIwEAYDVQQLDAnlupTmg
     KXlip4xEjAQBgNVBAMMCeeOi+aMr+WuhzEcMBoGCgmSJomT8ixkAQEMDDIyMTIxMDAxMDAwNzB6M
     BQGByqGSM49AgEGCSqBHIFFAYdoCANiAAScYxXBQbH0z1lJp7SF2oeAlQKidASCBgPbazQlm7uX5
     eDvOpzTcx6pW0na611Ifp6jHVCANE/YP6ljZcyOaVcHxlkqBNlpXysK/kYGJoEcXeJlAoykt55wn
     b6WT6NM5kqjDzANMAsGA1UdDwQEAwIDODALBgkqgRyBRQGHaAsDYQDbnnzwyc+YygA4sYPI4ruXy
     zi1GL7ArhCxcLGJlCzZB4qOk1tl4MeI2hkDa7HWohVFseGZM6eDawnlhoYgziCXWO3umwIlQWk/I
     aikJsiEx+cPqRd6YfrR0VKQGELocU0=
    EncryptnotAfter: 20200614115959
    userCertificate;binary:: MIICcTCCAf2gAwIBAgIDAPAKMAsGCSqBHIFFAYdoCzCBpDE2MDQG
     A1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwNAYD
     VQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQBgNV
     BAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxNDE2
     MDAwMFoXDTIwMDYxNDE1NTk1OVowgY8xHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbvTEn
     MCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMRIwEAYDVQQLDAnlupTmgKXl
     ip4xEjAQBgNVBAMMCeeOi+aMr+WuhzEcMBoGCgmSJomT8ixkAQEMDDIyMTIxMDAxMDAwNzB6MBQG
     ByqGSM49AgEGCSqBHIFFAYdoCANiAAR79CLIZHbBRuvwO8gjSnFwkfRzMg3E21uALi39anq1cyrS
     F9N7o42uEODEjKbGzQSZ6gfKfjAssBT38FOV3k8RJtUUtP0crfaGhIvrE6k87AxyX78cRa2KQOc2
     DCOQDtKjDzANMAsGA1UdDwQEAwIGwDALBgkqgRyBRQGHaAsDYQBVfwdkcKS4J86ntBmCbU2SGGvS
     FwtrIENOvtHaDdQxGW/vNN7LXd5yqyG+O7NUlPGsOvrMOYnXIDwkzkRulssMhmtTEC1D8bIQHOv+
     vZGhZxcNQxtS059fgW8JvjwHbJI=
    objectClass: wstCertificateUser
    serialNumber: F00A
    EncryptserialNumber: EFF9
    cn:: 546L5oyv5a6H
    
    dn:: b3U956eY5Lmm5aSELG895rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FLCBjPWNu
    changetype:add
    ou:: 56eY5Lmm5aSE
    objectClass: organizationalUnit
    
    dn:: Y2495q+b5pet5ZCbLG91PeenmOS5puWkhCxvPea1t+WNl+ecgeS6uuawkeaUv+W6nOWKnuWF
     rOWOhSwgYz1jbg==
    notAfter: 20200614115959
    EncryptCertificate;binary:: MIICcTCCAf2gAwIBAgIDAO/6MAsGCSqBHIFFAYdoCzCBpDE2M
     DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
     AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
     gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
     DE2MDAwMFoXDTIwMDYxNDE1NTk1OVowgY8xHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
     TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMRIwEAYDVQQLDAnnp5jku
     ablpIQxEjAQBgNVBAMMCeavm+aXreWQmzEcMBoGCgmSJomT8ixkAQEMDDIyMTIxMDAxMDAwNDB6M
     BQGByqGSM49AgEGCSqBHIFFAYdoCANiAARGHqzYbixoBc2j5YlZ4kli2AcOrclQeOibMlkV0KUZQ
     umacnp8NHDY6LGkmauR8Ux7g7nfskn/PyF1NImXq/4AtkFFN9i+xtgc/rLC+APiVlFP+6+PfCgtF
     /dxboIxfrGjDzANMAsGA1UdDwQEAwIDODALBgkqgRyBRQGHaAsDYQC2Xmq72mcTduYImECzlxHvK
     fmibBKuC/UQgcSffId5egTUwerP07aPUnhY1WPtH0ZaZaIZaNJYiSg/Nde4G47KcbIhNYGlLy51l
     rvqGcv3y2Wkq6DJCgJzAxBFAWjyE8A=
    EncryptnotAfter: 20200614115959
    userCertificate;binary:: MIICcTCCAf2gAwIBAgIDAPAGMAsGCSqBHIFFAYdoCzCBpDE2MDQG
     A1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwNAYD
     VQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQBgNV
     BAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxNDE2
     MDAwMFoXDTIwMDYxNDE1NTk1OVowgY8xHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbvTEn
     MCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMRIwEAYDVQQLDAnnp5jkuabl
     pIQxEjAQBgNVBAMMCeavm+aXreWQmzEcMBoGCgmSJomT8ixkAQEMDDIyMTIxMDAxMDAwNDB6MBQG
     ByqGSM49AgEGCSqBHIFFAYdoCANiAAQupbkVlEm0gDMONZwm2TEmjW2yTIGt4E29fIcdCeibIRER
     KuzdK74ooP/Y9DiyB36GZn99fXQx2edQE1QwTy8k+kpvTxhju5owkeLTgr5AxgSRATmZHeQzqpoN
     ZaFXIW6jDzANMAsGA1UdDwQEAwIGwDALBgkqgRyBRQGHaAsDYQCFgDwc/BUo37U3FW2s/kOmzozC
     cYyoAazxJlALmwRY+UhgzcBEawASSlCwTonWFpkWO2eTTtUhWPM56n/WXNS0b4wyTA7xGnYyCJHN
     lLoUzKgjHGTortRlfFu4uXdV7TQ=
    objectClass: wstCertificateUser
    serialNumber: F006
    EncryptserialNumber: EFFA
    cn:: 5q+b5pet5ZCb
    
    dn:: Y2495YiY6Imz5pilLG91PeeUteWtkOaUv+WKoeWKnuWFrOWupCxvPea1t+WNl+ecgeS6uuaw
     keaUv+W6nOWKnuWFrOWOhSwgYz1jbg==
    notAfter: 20200614115959
    EncryptCertificate;binary:: MIICfTCCAgmgAwIBAgIDAO/7MAsGCSqBHIFFAYdoCzCBpDE2M
     DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
     AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
     gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
     DE2MDAwMFoXDTIwMDYxNDE1NTk1OVowgZsxHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
     TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMR4wHAYDVQQLDBXnlLXlr
     ZDmlL/liqHlip7lhazlrqQxEjAQBgNVBAMMCeWImOiJs+aYpTEcMBoGCgmSJomT8ixkAQEMDDIyM
     TIxMDAxMDAwMzB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAATV4f5bcNKedbU8foAgfiPbCTSY2
     keftHKgSoISfWUgt+nIth5onA//lbasZYpqkB7LVBCYRvB6aSWp2Evq7KBV+S8+0Le+QEty6kCkG
     kRZtQfGZipQnWOXSR0RsIohPvujDzANMAsGA1UdDwQEAwIDODALBgkqgRyBRQGHaAsDYQCXJmMnm
     /l4RjcFG8kEc2dxHsYgRJKz5Gc7Wxq8ebzwQGdiMgNShAKufMCWmgEksBExvGpM6rGrqPtH9JMMU
     1BgS0/GwAW7SAGQQyKLUQ1q9TzgvFMprNZR3zejQB1287Y=
    EncryptnotAfter: 20200614115959
    userCertificate;binary:: MIICfTCCAgmgAwIBAgIDAPAEMAsGCSqBHIFFAYdoCzCBpDE2MDQG
     A1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwNAYD
     VQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQBgNV
     BAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxNDE2
     MDAwMFoXDTIwMDYxNDE1NTk1OVowgZsxHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbvTEn
     MCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMR4wHAYDVQQLDBXnlLXlrZDm
     lL/liqHlip7lhazlrqQxEjAQBgNVBAMMCeWImOiJs+aYpTEcMBoGCgmSJomT8ixkAQEMDDIyMTIx
     MDAxMDAwMzB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAASooCVyDiFZbP0mcfqWl0iMZuF3k4Tq
     TkOjxhjFvmVQ5C6tHER8gk/VTH5K4gio41Xc21vrWG3ZpuAptInDol4l6gax4YpQHVmRiJzwAk9c
     GXZcS2cengJgY8pMPwNs6eejDzANMAsGA1UdDwQEAwIGwDALBgkqgRyBRQGHaAsDYQD33R1htZsQ
     q9A1lruxb6AlSmPiZGTmVc2ahAgCODqQk8tdLtWszLdXulB0DTFPeDMIxo7l6jzwlEm5WvunvIR7
     tmJq7XRGbPfMrhYOEJVsdffhMbHZn61aF0vqdWp6rGY=
    objectClass: wstCertificateUser
    serialNumber: F004
    EncryptserialNumber: EFFB
    cn:: 5YiY6Imz5pil
    
    dn:: b3U9552j5p+l5a6kLG895rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FLCBjPWNu
    changetype:add
    ou:: 552j5p+l5a6k
    objectClass: organizationalUnit
    
    dn:: Y2495byg5LuB57+ULG91Peedo+afpeWupCxvPea1t+WNl+ecgeS6uuawkeaUv+W6nOWKnuWF
     rOWOhSwgYz1jbg==
    notAfter: 20200614115959
    EncryptCertificate;binary:: MIICcTCCAf2gAwIBAgIDAO/8MAsGCSqBHIFFAYdoCzCBpDE2M
     DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
     AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
     gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
     DE2MDAwMFoXDTIwMDYxNDE1NTk1OVowgY8xHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
     TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMRIwEAYDVQQLDAnnnaPmn
     6XlrqQxEjAQBgNVBAMMCeW8oOS7gee/lDEcMBoGCgmSJomT8ixkAQEMDDIyMTIxMDAxMDAxMDB6M
     BQGByqGSM49AgEGCSqBHIFFAYdoCANiAAR7D5EkIgvppfnj1yB6xh/8aji9qo9OKPz8WYeGiUBeF
     Be+6FHbLYw3s91+dF+yVglPplaxQ+lBIo15lBRgZom7WgqPIngPrOu1plqIAzi7jqW/PJ52IlXUQ
     aEQiw32CfCjDzANMAsGA1UdDwQEAwIDODALBgkqgRyBRQGHaAsDYQCNXYLkG/Oqd0Jj49HxdXM3Z
     1ERmJenTrVnHfzlA0pZCV/EOscfIJXyqhkCTKpveQJGCg9ruVLZnbSq+vvHKoExETYilZrXbhz9d
     04ludMSny2s/qpnULLdGDmYRx7HaTU=
    EncryptnotAfter: 20200614115959
    userCertificate;binary:: MIICcTCCAf2gAwIBAgIDAPAPMAsGCSqBHIFFAYdoCzCBpDE2MDQG
     A1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwNAYD
     VQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQBgNV
     BAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxNDE2
     MDAwMFoXDTIwMDYxNDE1NTk1OVowgY8xHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbvTEn
     MCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMRIwEAYDVQQLDAnnnaPmn6Xl
     rqQxEjAQBgNVBAMMCeW8oOS7gee/lDEcMBoGCgmSJomT8ixkAQEMDDIyMTIxMDAxMDAxMDB6MBQG
     ByqGSM49AgEGCSqBHIFFAYdoCANiAASzeF0+mnputFpfuXEpUV8aMGd35FIWuYlJNAXRsEVTg3Fv
     38nvrFlz75rkvpfxxLTLRbL1BAmUlW5vWvKIl0QBft7kwKCjpEM/lvXx/fPwOvEb8Bcgwi/t/d8H
     rI5rBxGjDzANMAsGA1UdDwQEAwIGwDALBgkqgRyBRQGHaAsDYQBnJP0+gFGtZAQoMo9aEsnWBtrh
     o3Ul8YYLy6G0wFCvtKv6UVIgslrVRjXGI1PsEQ8l0pY0xKj+QFd/S2wkvfr3Z5iYX3bZ2yf5DH4+
     bL4N+lro1+8prXm1VamwWWkgsOI=
    objectClass: wstCertificateUser
    serialNumber: F00F
    EncryptserialNumber: EFFC
    cn:: 5byg5LuB57+U
    
    dn:: Y2496ams5rW35LicLG91PeeUteWtkOaUv+WKoeWKnuWFrOWupCxvPea1t+WNl+ecgeS6uuaw
     keaUv+W6nOWKnuWFrOWOhSwgYz1jbg==
    notAfter: 20200614115959
    EncryptCertificate;binary:: MIICfTCCAgmgAwIBAgIDAO/9MAsGCSqBHIFFAYdoCzCBpDE2M
     DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
     AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
     gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
     DE2MDAwMFoXDTIwMDYxNDE1NTk1OVowgZsxHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
     TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMR4wHAYDVQQLDBXnlLXlr
     ZDmlL/liqHlip7lhazlrqQxEjAQBgNVBAMMCemprOa1t+S4nDEcMBoGCgmSJomT8ixkAQEMDDIyM
     TIxMDAxMDAwMjB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAAREQEWC8lO5LVxQi3rojEpCVgp1I
     F3IWrU37oQVZcjReBg2KQMtIi/ZIUzzKCVNNztQ5V5bqnQ9VcnhU3iiTUeNRRMr0tSEvcL0OBRmJ
     T5hqD9YHVx7+2NmQ6vEf7FX66yjDzANMAsGA1UdDwQEAwIDODALBgkqgRyBRQGHaAsDYQC+Vb7M6
     Wlp4R2ueehitZUsWjhK5F7oiopV5SmiIDUofR1vMfsr/5qzVMXYV9+g349ndh77mM5sj2IjfkEmz
     uP9g+Q9zCvsH6T+zKoh74eRqbh7wIfIu8QyJloiddB/t/8=
    EncryptnotAfter: 20200614115959
    userCertificate;binary:: MIICfTCCAgmgAwIBAgIDAPAMMAsGCSqBHIFFAYdoCzCBpDE2MDQG
     A1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwNAYD
     VQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQBgNV
     BAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxNDE2
     MDAwMFoXDTIwMDYxNDE1NTk1OVowgZsxHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbvTEn
     MCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMR4wHAYDVQQLDBXnlLXlrZDm
     lL/liqHlip7lhazlrqQxEjAQBgNVBAMMCemprOa1t+S4nDEcMBoGCgmSJomT8ixkAQEMDDIyMTIx
     MDAxMDAwMjB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAAQm66YsAYr2PS3BYGvb5AuLXdMeoP33
     BET9UME9pYdKYvLHK1EKdtnEGT3V0B/NLhTtoqZjmYELh82rMM081DU/tPOLbvN8PJzQ7vMC8KCQ
     j+xXHd7rCAAlGFr9In+BsHCjDzANMAsGA1UdDwQEAwIGwDALBgkqgRyBRQGHaAsDYQB6vLVLTGRS
     9P/dtDnnxDSV9pfWCPVOYRIoQH3XPBezQ+Q56RIdjhCuHOF+dem5/kyAH6UpHZmzw4+9qp9lwr/V
     rnF3bFYN9NXHb6yPBH2YtS8fH+cmjZda6RBENdEzSLQ=
    objectClass: wstCertificateUser
    serialNumber: F00C
    EncryptserialNumber: EFFD
    cn:: 6ams5rW35Lic
    
    dn:: Y2495L+e5am3LG91PeenmOS5puWkhCxvPea1t+WNl+ecgeS6uuawkeaUv+W6nOWKnuWFrOWO
     hSwgYz1jbg==
    notAfter: 20200614115959
    EncryptCertificate;binary:: MIICbjCCAfqgAwIBAgIDAO/+MAsGCSqBHIFFAYdoCzCBpDE2M
     DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
     AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
     gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
     DE2MDAwMFoXDTIwMDYxNDE1NTk1OVowgYwxHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
     TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMRIwEAYDVQQLDAnnp5jku
     ablpIQxDzANBgNVBAMMBuS/nuWptzEcMBoGCgmSJomT8ixkAQEMDDIyMTIxMDAxMDAwOTB6MBQGB
     yqGSM49AgEGCSqBHIFFAYdoCANiAARXOVTTUAN/QFsjNaXxCg84+vYMcIlWD+Y1f97BJk7NB2QGW
     7OGmS62Dxdn/9mEUJ5iAq8HepSKry4H1vgzeav0mCOlZE/d4mu2+I3VQ6nqC5CZtoXSBcF+9o1Tp
     RbgKX6jDzANMAsGA1UdDwQEAwIDODALBgkqgRyBRQGHaAsDYQDEr8d8RcgdWfENywURju23XUEbd
     TrDMkOylNCTZExhGlwEFuoVBBAKn1bT0SqUWFOZg8uvoUofntW5HCIKl96JPbnKjOiqsOZdJnNbZ
     Vk3A1jxHZEd9Vk07nELKWGaF0w=
    EncryptnotAfter: 20200614115959
    userCertificate;binary:: MIICbjCCAfqgAwIBAgIDAPAIMAsGCSqBHIFFAYdoCzCBpDE2MDQG
     A1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwNAYD
     VQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQBgNV
     BAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxNDE2
     MDAwMFoXDTIwMDYxNDE1NTk1OVowgYwxHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbvTEn
     MCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMRIwEAYDVQQLDAnnp5jkuabl
     pIQxDzANBgNVBAMMBuS/nuWptzEcMBoGCgmSJomT8ixkAQEMDDIyMTIxMDAxMDAwOTB6MBQGByqG
     SM49AgEGCSqBHIFFAYdoCANiAAR7gb4bsSR3HSwoLLMP+ee6pjWp9w6xdOtjtvZxBg0O+kGlP0vu
     GiCCjWAEHxshsCgBCD07BkhJEvsUhOiP+UH7d9Y+cDDYDocb5DomdRoIcKDB2cirZhbXtYIa2XGH
     4LKjDzANMAsGA1UdDwQEAwIGwDALBgkqgRyBRQGHaAsDYQCMeAl6+zGFXFlan2KROaY/RLVEjXHA
     H8mt1hZDWlsSniX0DuLlemv6WxCX9LIAJjeb8siu4kz9u8CkkbPv8d37O+UgegpdYEc0xXTztPZe
     bl5YaqKRnCAhKtQEGmhlE5g=
    objectClass: wstCertificateUser
    serialNumber: F008
    EncryptserialNumber: EFFE
    cn:: 5L+e5am3
    
    dn:: Y2495byg5oGS54aZLG91PeW6lOaApeWKnixvPea1t+WNl+ecgeS6uuawkeaUv+W6nOWKnuWF
     rOWOhSwgYz1jbg==
    notAfter: 20200614115959
    EncryptCertificate;binary:: MIICcTCCAf2gAwIBAgIDAO//MAsGCSqBHIFFAYdoCzCBpDE2M
     DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
     AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
     gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
     DE2MDAwMFoXDTIwMDYxNDE1NTk1OVowgY8xHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
     TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMRIwEAYDVQQLDAnlupTmg
     KXlip4xEjAQBgNVBAMMCeW8oOaBkueGmTEcMBoGCgmSJomT8ixkAQEMDDIyMTIxMDAxMDAwNTB6M
     BQGByqGSM49AgEGCSqBHIFFAYdoCANiAASk0YZd+hozUD67UfqGdyDp2ypbquGCgqPkCnkCa8Lpv
     +qWRIYRyRfLLAubw2iBFDEtaOKX37haCIicMDH+cJwNgWU0x8xri5vMHveSJHSlwVFsCAjiYxpIg
     7dt58xHtySjDzANMAsGA1UdDwQEAwIDODALBgkqgRyBRQGHaAsDYQCEjzbTkWR6vZUjfe732XGyE
     yDfnjBpejsx8kHn/kgqnwAguCxxEPiNROByOEzTeC0OL6Jw9fhPDDj/ubw6z68agRVogjToeQepR
     CNIyfS61l4LMcJLZUBuP2WgaJgHt7E=
    EncryptnotAfter: 20200614115959
    userCertificate;binary:: MIICcTCCAf2gAwIBAgIDAPALMAsGCSqBHIFFAYdoCzCBpDE2MDQG
     A1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwNAYD
     VQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQBgNV
     BAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxNDE2
     MDAwMFoXDTIwMDYxNDE1NTk1OVowgY8xHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbvTEn
     MCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMRIwEAYDVQQLDAnlupTmgKXl
     ip4xEjAQBgNVBAMMCeW8oOaBkueGmTEcMBoGCgmSJomT8ixkAQEMDDIyMTIxMDAxMDAwNTB6MBQG
     ByqGSM49AgEGCSqBHIFFAYdoCANiAAQsI+c/is/BdtC9qylJc6TnroZWhwV/FYmYHCj29UoSbSrJ
     KErgaMojLEjReERjax7kq+b3OYTQwbB0QDxfFkTgHH6qRvb743UUiO3jlBqBfigcZT10oyyORs0U
     zEL70AmjDzANMAsGA1UdDwQEAwIGwDALBgkqgRyBRQGHaAsDYQB9JRENKJVVtXknenoFtA8TTq2h
     BU9nKEc1TcBqMzFlv92tilGbCfr8vO5wO8fIcFExvidZORJFqjrZebBGQZHRlsEBMBzKpj3pp8gI
     /uUQBEJ2c1LJuGMotAKHX7ecbz4=
    objectClass: wstCertificateUser
    serialNumber: F00B
    EncryptserialNumber: EFFF
    cn:: 5byg5oGS54aZ
    
    dn:: b3U95paw6Ze75L+h5oGv5aSELG895rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FLCBj
     PWNu
    ou:: 5paw6Ze75L+h5oGv5aSE
    objectClass: organizationalUnit
    
    dn:: Y2496YKT56eL6IuxLG91PeaWsOmXu+S/oeaBr+WkhCxvPea1t+WNl+ecgeS6uuawkeaUv+W6
     nOWKnuWFrOWOhSwgYz1jbg==
    notAfter: 20200614115959
    EncryptCertificate;binary:: MIICdzCCAgOgAwIBAgIDAPAAMAsGCSqBHIFFAYdoCzCBpDE2M
     DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
     AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
     gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
     DE2MDAwMFoXDTIwMDYxNDE1NTk1OVowgZUxHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
     TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMRgwFgYDVQQLDA/mlrDpl
     7vkv6Hmga/lpIQxEjAQBgNVBAMMCemCk+eni+iLsTEcMBoGCgmSJomT8ixkAQEMDDIyMTIxMDAxM
     DAwMTB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAASJ3RcGfo8cVUDTfawSKXngNpSoJH36bVjDb
     EU+QvW4L4pp3SQr+IKXOlGvR1R8IMXhhl3Kidbijkk4xphBGHJlgWVrCB2YsyrKFYTCjjcRXlzsp
     HM3kqtDpg0Ce2OSwfSjDzANMAsGA1UdDwQEAwIDODALBgkqgRyBRQGHaAsDYQC94CmAJ301xBDQw
     ObclFDJ4dQI3oVxxSNrB7DtI7s2ElthNDEV1MAekOilrcEgbamawm4H2cVw3eKk+q+6kolKoo3Kh
     qVcFtF1uD8nUanvvfO8wrBhwgzQEy3bBQsfKKg=
    EncryptnotAfter: 20200614115959
    userCertificate;binary:: MIICdzCCAgOgAwIBAgIDAPAOMAsGCSqBHIFFAYdoCzCBpDE2MDQG
     A1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwNAYD
     VQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQBgNV
     BAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxNDE2
     MDAwMFoXDTIwMDYxNDE1NTk1OVowgZUxHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbvTEn
     MCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMRgwFgYDVQQLDA/mlrDpl7vk
     v6Hmga/lpIQxEjAQBgNVBAMMCemCk+eni+iLsTEcMBoGCgmSJomT8ixkAQEMDDIyMTIxMDAxMDAw
     MTB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAAT/c/uLk1Qk7AqTCNmpl3mbR6bZG/f73gq6oZLU
     rize0LClvwNBvEQ8fQNiqklwfZ5noXpG6p4a3vdYb/pNVtMqS+p2rWhaU/4hTHBpMurv9ha0zMPs
     7oftu2T3sawXtH2jDzANMAsGA1UdDwQEAwIGwDALBgkqgRyBRQGHaAsDYQBVTFutTDZ6cPeKjXAs
     z7DNQKJgv3trvAHLnHHag9mVG+HG9ypIniuMqGRqkk0jKPDjpa62fWUfFKI09zkvYAsP2Oq4G4Sc
     OiOQrKr0w4YT4Dw7EFtHh53Y21B0/3CDbHM=
    objectClass: wstCertificateUser
    serialNumber: F00E
    EncryptserialNumber: F000
    cn:: 6YKT56eL6Iux
    
    dn:: Y2495byg5YWI5piMLG91PeaWsOmXu+S/oeaBr+WkhCxvPea1t+WNl+ecgeS6uuawkeaUv+W6
     nOWKnuWFrOWOhSwgYz1jbg==
    notAfter: 20200614115959
    EncryptCertificate;binary:: MIICdzCCAgOgAwIBAgIDAPABMAsGCSqBHIFFAYdoCzCBpDE2M
     DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
     AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
     gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
     DE2MDAwMFoXDTIwMDYxNDE1NTk1OVowgZUxHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
     TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMRgwFgYDVQQLDA/mlrDpl
     7vkv6Hmga/lpIQxEjAQBgNVBAMMCeW8oOWFiOaYjDEcMBoGCgmSJomT8ixkAQEMDDIyMTIxMDAxM
     DAxMTB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAAQsUEpbw4WCp1Z/MZEwmXBEpnKHBFoMxR10p
     g75oJ/bcUdLcf0j0RcZBKRFQZdBkmyfv1Py6xqB+uPmVXD1dkcEQ418wzazWm02fPVQupQtu013f
     mdOqlm569X8fdKA2yCjDzANMAsGA1UdDwQEAwIDODALBgkqgRyBRQGHaAsDYQBJF1dtYTBtQfTOs
     pjSjj/pGt5do/rI/I9YU88XuFpr5NazWXmfHsLLAE3hqANY4xeQNfrwrPRNDD7rJCRq0ewBI5a/E
     QZEpGhR54dTf8q2h1Rm5ymIG5pSQIgtexzCIu4=
    EncryptnotAfter: 20200614115959
    userCertificate;binary:: MIICdzCCAgOgAwIBAgIDAPANMAsGCSqBHIFFAYdoCzCBpDE2MDQG
     A1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwNAYD
     VQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQBgNV
     BAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxNDE2
     MDAwMFoXDTIwMDYxNDE1NTk1OVowgZUxHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbvTEn
     MCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMRgwFgYDVQQLDA/mlrDpl7vk
     v6Hmga/lpIQxEjAQBgNVBAMMCeW8oOWFiOaYjDEcMBoGCgmSJomT8ixkAQEMDDIyMTIxMDAxMDAx
     MTB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAASE54Ac3/GQ5SDO1ZaGyZ+7iADWWm28knQDytjM
     0gSkb3URScaRxUpp952SmYbdEKjnYoLx8Mq0dyPoRDa+m9CWy9Ppn8KPpiTU4vxy0VnyXSDt4pmP
     mAG02ppMeDo9KlmjDzANMAsGA1UdDwQEAwIGwDALBgkqgRyBRQGHaAsDYQAX3XlXjdXZFgpxkQQE
     DopiYfECJv5PDVL9ILF5+wljcahb9ES/I1ubKqv2SW9qLiUqeurpCzhw2Icon2Ah8FcAYSCDhCQ/
     /Gmc/MjRrBT8rvXPYGdLb5zWRMTRccrV/fU=
    objectClass: wstCertificateUser
    serialNumber: F00D
    EncryptserialNumber: F001
    cn:: 5byg5YWI5piM
    
    dn:: Y2495LqO6LSk5oiQLG91Peedo+afpeWupCxvPea1t+WNl+ecgeS6uuawkeaUv+W6nOWKnuWF
     rOWOhSwgYz1jbg==
    notAfter: 20200614115959
    EncryptCertificate;binary:: MIICcTCCAf2gAwIBAgIDAPACMAsGCSqBHIFFAYdoCzCBpDE2M
     DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
     AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
     gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
     DE2MDAwMFoXDTIwMDYxNDE1NTk1OVowgY8xHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
     TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMRIwEAYDVQQLDAnnnaPmn
     6XlrqQxEjAQBgNVBAMMCeS6jui0pOaIkDEcMBoGCgmSJomT8ixkAQEMDDIyMTIxMDAxMDAwNjB6M
     BQGByqGSM49AgEGCSqBHIFFAYdoCANiAAT2LsSPTVOm4bWarrKFyBQDF8jKzP9hc1atfiKgcy0JL
     Q8eDhNIkN7MFZV2Qq1D0B5nuYQ4bCCdO0vgGeGhzThi24Z5iMU6G3SixZInNFsno71iRBUCkufZb
     tQLM+QU0SGjDzANMAsGA1UdDwQEAwIDODALBgkqgRyBRQGHaAsDYQB6qkE3SC65UnG7KbmQ8Dtt4
     njk4gTyp9PY6UfFg4pGb1uLFffMKS5jHz9DvKgk+yRBTef4UjP0qRA3hZIReXBhPRCBhbLh2zEnV
     3Uctz9ZtVy/xxppF24MNirjPBXQnHs=
    EncryptnotAfter: 20200614115959
    userCertificate;binary:: MIICcTCCAf2gAwIBAgIDAPAHMAsGCSqBHIFFAYdoCzCBpDE2MDQG
     A1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwNAYD
     VQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQBgNV
     BAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxNDE2
     MDAwMFoXDTIwMDYxNDE1NTk1OVowgY8xHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbvTEn
     MCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMRIwEAYDVQQLDAnnnaPmn6Xl
     rqQxEjAQBgNVBAMMCeS6jui0pOaIkDEcMBoGCgmSJomT8ixkAQEMDDIyMTIxMDAxMDAwNjB6MBQG
     ByqGSM49AgEGCSqBHIFFAYdoCANiAAQ72jqVYk22FoVWoX/Pk7Zg7bgdnvGzA+kyBK0dGtrxSZ1Y
     OnlyP75IoIJxqOerXy9KwgZRWtkDuBcS2I62rTU2c//7D2Zfwj1kEcDRwXy0SGMUCK6bZIigRFUU
     DY4WHeijDzANMAsGA1UdDwQEAwIGwDALBgkqgRyBRQGHaAsDYQBHNA3CCF1cpw98PGdJZJEwzxlL
     /LZpKYFqXHjKyXCm0meKVQLc3DHk26QGrMI0YOYnxBQppeYmHjU5upQQb2FZdxz/bEj0PRWJmiJH
     EBue5hV+m6LuI7eZ++6KC33Fu8w=
    objectClass: wstCertificateUser
    serialNumber: F007
    EncryptserialNumber: F002
    cn:: 5LqO6LSk5oiQ
    
    dn:: Y2496YOR5Zu95piOLG91PeeUteWtkOaUv+WKoeWKnuWFrOWupCxvPea1t+WNl+ecgeS6uuaw
     keaUv+W6nOWKnuWFrOWOhSwgYz1jbg==
    notAfter: 20200614115959
    EncryptCertificate;binary:: MIICfTCCAgmgAwIBAgIDAPADMAsGCSqBHIFFAYdoCzCBpDE2M
     DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
     AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
     gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
     DE2MDAwMFoXDTIwMDYxNDE1NTk1OVowgZsxHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
     TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMR4wHAYDVQQLDBXnlLXlr
     ZDmlL/liqHlip7lhazlrqQxEjAQBgNVBAMMCemDkeWbveaYjjEcMBoGCgmSJomT8ixkAQEMDDIyM
     TIxMDAxMDAwODB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAAS3Eg3r2xyMskJap1A2kYJcfnKUP
     TwZOhKaX5hDga6OwxG7nsPsMqKJxHXLlTKde/mRb7IOt8KaaNHI3nfyuyUxqunOAKCKxxTlvkKgW
     XVOJDLVZOIpg2qyQMMiGq8OkDejDzANMAsGA1UdDwQEAwIDODALBgkqgRyBRQGHaAsDYQBKZbbUI
     1SFUpGaYB335UT4hyHL6nJmjDl5NAeaQwQLEBRAfNZBTIseySF3Kuiff5nCYYkWjEFVCTZA9g4qy
     IyH1tGXzsPs0a++hfRBHXFzVXxArfOXWq9NZZ0/8CjupPA=
    EncryptnotAfter: 20200614115959
    userCertificate;binary:: MIICfTCCAgmgAwIBAgIDAPAQMAsGCSqBHIFFAYdoCzCBpDE2MDQG
     A1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwNAYD
     VQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQBgNV
     BAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxNDE2
     MDAwMFoXDTIwMDYxNDE1NTk1OVowgZsxHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbvTEn
     MCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMR4wHAYDVQQLDBXnlLXlrZDm
     lL/liqHlip7lhazlrqQxEjAQBgNVBAMMCemDkeWbveaYjjEcMBoGCgmSJomT8ixkAQEMDDIyMTIx
     MDAxMDAwODB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAASJZ8VG7wTFTcp3iN/giqpAafmzoagT
     svWHilseMZaQrticqx1YfojFvmFxOftOHB+6hJrpOWT1Fa8aj8x5niFkuK0o3/R7STu0y9hzoAWd
     RVx5TQOjWJQUt++31Ks64VSjDzANMAsGA1UdDwQEAwIGwDALBgkqgRyBRQGHaAsDYQAPGxgxepGg
     zKy0hYlLNa9H83czGFrd3XQ7JvgYubIRPSyO9XY1AwQmPfeZnNzQgTQ8kqEXRbzl/GPqa4nJWMY8
     MU621vL5dE+U/ummILC6NIFOZWSL0EopaG7d2fasKLw=
    objectClass: wstCertificateUser
    serialNumber: F010
    EncryptserialNumber: F003
    cn:: 6YOR5Zu95piO
    
    dn:: Y2495YiY6ZuELG91PeeUteWtkOaUv+WKoeWKnuWFrOWupCxvPea1t+WNl+ecgeS6uuawkeaU
     v+W6nOWKnuWFrOWOhSwgYz1jbg==
    notAfter: 20200614115959
    EncryptCertificate;binary:: MIICejCCAgagAwIBAgIDAPAFMAsGCSqBHIFFAYdoCzCBpDE2M
     DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
     AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
     gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
     DE2MDAwMFoXDTIwMDYxNDE1NTk1OVowgZgxHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
     TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMR4wHAYDVQQLDBXnlLXlr
     ZDmlL/liqHlip7lhazlrqQxDzANBgNVBAMMBuWImOmbhDEcMBoGCgmSJomT8ixkAQEMDDIyMTIxM
     DAxMDAxMjB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAASZpPPLO/EbPfMGhY34+6yVVNZwaq0gz
     z+gNL6wwj58Swb5avhrQVNOJ199OO5NGu1ESShc/N0QKan/3lM7jJOr1QuA9JlrbPkwUUs/Pk+2e
     dMnd254IYkJkUiUXVN0O66jDzANMAsGA1UdDwQEAwIDODALBgkqgRyBRQGHaAsDYQCryhp3sqTBZ
     8kbXsUrtJilrqs5w5jQFcuZDjke802Q9LldGF9TA+fF1/v8A+SKmNFVdKI9HeO6i4qzRx7JQAE5M
     6qVnmcOkr3ujnCiOshPhKdiWo/lNovDZVZME+BFbg4=
    EncryptnotAfter: 20200614115959
    userCertificate;binary:: MIICejCCAgagAwIBAgIDAPAJMAsGCSqBHIFFAYdoCzCBpDE2MDQG
     A1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwNAYD
     VQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQBgNV
     BAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxNDE2
     MDAwMFoXDTIwMDYxNDE1NTk1OVowgZgxHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbvTEn
     MCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMR4wHAYDVQQLDBXnlLXlrZDm
     lL/liqHlip7lhazlrqQxDzANBgNVBAMMBuWImOmbhDEcMBoGCgmSJomT8ixkAQEMDDIyMTIxMDAx
     MDAxMjB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAATWQJCy2ENxXaqv9OpsoyV2IfpRm6EVTQ9i
     yqfsMTkHBjPC8NQmlOgYU1mudci1wXahVQOKC65fIaAqbwzZPu+5Q9EzazkkCRejsMbVkafp/L2D
     vvByoQfLlpTZPXnH5oCjDzANMAsGA1UdDwQEAwIGwDALBgkqgRyBRQGHaAsDYQCXOsoFPbGqf2sR
     GEEh1FySgTUBbwnr2E+T0d1atTqInX/puRTfuuF+SGdSHzoqzKCFcjfoZRXE1IdmUcpKYLHWZnT3
     xw6W7yZKePWg8RME0itmvAVC3jaNWYZEqbf0Aao=
    objectClass: wstCertificateUser
    serialNumber: F009
    EncryptserialNumber: F005
    cn:: 5YiY6ZuE
    
    dn:: Y2495rW35Y2X55yB5Lq65rCR5pS/5bqcLG91PeeUteWtkOaUv+WKoeWKnuWFrOWupCxvPea1
     t+WNl+ecgeS6uuawkeaUv+W6nOWKnuWFrOWOhSwgYz1jbg==
    EncryptCertificate;binary:: MIICfzCCAgugAwIBAgIDAPARMAsGCSqBHIFFAYdoCzCBpDE2M
     DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
     AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
     gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
     TE2MDAwMFoXDTIwMDYxNTE1NTk1OVowgZ0xHjAcBgNVBAMMFea1t+WNl+ecgeS6uuawkeaUv+W6n
     DEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MRIwEAYDVQQIDAnmtbfljZfnnIExJzAlB
     gNVBAoMHua1t+WNl+ecgeS6uuawkeaUv+W6nOWKnuWFrOWOhTEeMBwGA1UECwwV55S15a2Q5pS/5
     Yqh5Yqe5YWs5a6kMHowFAYHKoZIzj0CAQYJKoEcgUUBh2gIA2IABDjDxa3JeTB+4Q846SKfQEj7v
     FMBYXOi6gOyaOdPtXuDWjzPt714OukAeUceWp4fSBxmVGHMVFRj36hdcetkrZFdtKZktY7tm4yVu
     JOGiScjMq8wb0E1y2L5QbKHtj7OnqMPMA0wCwYDVR0PBAQDAgM4MAsGCSqBHIFFAYdoCwNhALEih
     LJkSVjCu6suTDg3z7m7tAZAUcuphZbtQhz1WBUBrOTWvvofjEdZQJ2C64KzoqXC8Ikx6FlVjStsn
     28ZnLIGo2zvh3ZGJujkKtOaI/pYIryloazRb39Dk/uDcorjAg==
    EncryptnotAfter: 20200615115959
    objectClass: wstCertificateUser
    EncryptserialNumber: F011
    cn:: 5rW35Y2X55yB5Lq65rCR5pS/5bqc
    
    dn:: Y24955yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf55S15a2Q5Y2w56ug5Y+R5biD6aqM6K+B
     57O757ufLG91PeeUteWtkOaUv+WKoeWKnuWFrOWupCxvPea1t+WNl+ecgeS6uuawkeaUv+W6nOWK
     nuWFrOWOhSwgYz1jbg==
    EncryptCertificate;binary:: MIICjzCCAhugAwIBAgIDAPASMAsGCSqBHIFFAYdoCzCBpDE2M
     DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
     AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
     gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
     TE2MDAwMFoXDTIwMDYxNTE1NTk1OVowga0xHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
     TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMR4wHAYDVQQLDBXnlLXlr
     ZDmlL/liqHlip7lhazlrqQxQjBABgNVBAMMOeecgeaUv+W6nOS/oeS7u+acjeWKoeezu+e7n+eUt
     eWtkOWNsOeroOWPkeW4g+mqjOivgeezu+e7nzB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAASxl
     dgx1eB/bGYJMJxcf/fFSfklt1DoLePXB5SNL9iCDkXyOwBfNuZQ/+MJKYm20MZVRtCfLm15FXSaE
     cubJgxxr9abn0a0mS2lqnKMPPMeIVmRItVB9ebnyS5M7By07l2jDzANMAsGA1UdDwQEAwID+DALB
     gkqgRyBRQGHaAsDYQCD+93k9XNMsNkzNLl3xgyVtlSmWtdPUclYWiGbPkT7J8V4pi5lMPDzVC2q6
     mzAMpJAjwgqlmaND0LnOM1alhDpF4kJr8u2AwpXz5bK7Q2obichggbS6tKwErwGJIXq2jE=
    EncryptnotAfter: 20200615115959
    objectClass: wstCertificateUser
    EncryptserialNumber: F012
    cn:: 55yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf55S15a2Q5Y2w56ug5Y+R5biD6aqM6K+B57O7
     57uf
    
    dn:: Y24955yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf55S15a2Q5Y2w56ug5Zyo57q/5pyN5Yqh
     57O757ufLG91PeeUteWtkOaUv+WKoeWKnuWFrOWupCxvPea1t+WNl+ecgeS6uuawkeaUv+W6nOWK
     nuWFrOWOhSwgYz1jbg==
    EncryptCertificate;binary:: MIICjzCCAhugAwIBAgIDAPATMAsGCSqBHIFFAYdoCzCBpDE2M
     DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
     AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
     gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
     TE2MDAwMFoXDTIwMDYxNTE1NTk1OVowga0xHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
     TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMR4wHAYDVQQLDBXnlLXlr
     ZDmlL/liqHlip7lhazlrqQxQjBABgNVBAMMOeecgeaUv+W6nOS/oeS7u+acjeWKoeezu+e7n+eUt
     eWtkOWNsOeroOWcqOe6v+acjeWKoeezu+e7nzB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAAT3Y
     3r7euWmkFJeo6UxvcwWXokankXJhPdwOQAJo0G01Ms8/ku57iF/1v9qnaGUpW1VmxB9M60Hrt6fq
     +5Xq9fP79aXN0K1ffsm0GurgajT/uTmvODYfDutYaULTiR5bQijDzANMAsGA1UdDwQEAwID+DALB
     gkqgRyBRQGHaAsDYQBL+Ifd3r8RUPOti/A3+lv2RGhSsn41XzWlsxzYo4JdPfO982MhNjlVQvuBw
     Wt7nqE6uISJ/aMacuD8W+QPS6ZQM93uDwddh3oGsRJRsM6H3hO2rivgz0I83MtdqMrx2YQ=
    EncryptnotAfter: 20200615115959
    objectClass: wstCertificateUser
    EncryptserialNumber: F013
    cn:: 55yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf55S15a2Q5Y2w56ug5Zyo57q/5pyN5Yqh57O7
     57uf
    
    dn:: Y24955yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf55S15a2Q5Y2w56ug562+5Y+R566h55CG
     6K6+5aSHLG91PeeUteWtkOaUv+WKoeWKnuWFrOWupCxvPea1t+WNl+ecgeS6uuawkeaUv+W6nOWK
     nuWFrOWOhSwgYz1jbg==
    EncryptCertificate;binary:: MIICjzCCAhugAwIBAgIDAPAUMAsGCSqBHIFFAYdoCzCBpDE2M
     DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
     AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
     gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
     TE2MDAwMFoXDTIwMDYxNTE1NTk1OVowga0xHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
     TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMR4wHAYDVQQLDBXnlLXlr
     ZDmlL/liqHlip7lhazlrqQxQjBABgNVBAMMOeecgeaUv+W6nOS/oeS7u+acjeWKoeezu+e7n+eUt
     eWtkOWNsOeroOetvuWPkeeuoeeQhuiuvuWkhzB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAASGt
     EDJAiKCQkDeLCCf5ERgSGXrp0HB60pzyvH0aT1E5JuiVYYpBpypHGRPdgOPAv2t7MSZZCktTCuUU
     GRK0XWwOZtFObMDIJTTFq6y/KOkrYJHvtgocUJYyNmv/HaBftWjDzANMAsGA1UdDwQEAwID+DALB
     gkqgRyBRQGHaAsDYQDeOAclwZoG9ulDpmi0gZaq8bnExzWbkcFo01+eoseqrCyyk0QUu/V3nJbaP
     o/1RqkR5dMAZJneCxFZSYNfmGFljS/u1t/C6ECcBW1IFaO7V+MuD55E6CKJQzLXlEQnmdE=
    EncryptnotAfter: 20200615115959
    objectClass: wstCertificateUser
    EncryptserialNumber: F014
    cn:: 55yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf55S15a2Q5Y2w56ug562+5Y+R566h55CG6K6+
     5aSH
    
    dn:: Y24955yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf55S15a2Q5Y2w56ug5rOo5YaM566h55CG
     6K6+5aSHLG91PeeUteWtkOaUv+WKoeWKnuWFrOWupCxvPea1t+WNl+ecgeS6uuawkeaUv+W6nOWK
     nuWFrOWOhSwgYz1jbg==
    EncryptCertificate;binary:: MIICjzCCAhugAwIBAgIDAPAVMAsGCSqBHIFFAYdoCzCBpDE2M
     DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
     AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
     gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
     TE2MDAwMFoXDTIwMDYxNTE1NTk1OVowga0xHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
     TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMR4wHAYDVQQLDBXnlLXlr
     ZDmlL/liqHlip7lhazlrqQxQjBABgNVBAMMOeecgeaUv+W6nOS/oeS7u+acjeWKoeezu+e7n+eUt
     eWtkOWNsOeroOazqOWGjOeuoeeQhuiuvuWkhzB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAATfe
     860NwLtJ6+WlxgzJKajw/4yaBdgsnZHH5UOz5KlHKal85vNYWeQ01/PpMRZNUaHHdZXwBeX1GoE0
     43H7Ydd8ljZwXNi7HeDSk5OZ0AMttAawy81TQ+2Ow34UHNRpc+jDzANMAsGA1UdDwQEAwID+DALB
     gkqgRyBRQGHaAsDYQBASlFH/K9QJt1QPS2y8ShLC8Htu1TB3dgO4TzTx8jtGh/gCGHenxcJDfjCz
     yZf1DmZouz26WhqZ8d/ouk6h/XPMBKD1ijXSls4bFMgmRtIOUPWD9w1lNkHAbhkIEvkR6o=
    EncryptnotAfter: 20200615115959
    objectClass: wstCertificateUser
    EncryptserialNumber: F015
    cn:: 55yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf55S15a2Q5Y2w56ug5rOo5YaM566h55CG6K6+
     5aSH
    
    dn:: Y24955yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf5Y+v5L+h5pe26Ze05pyN5YqhLG91PeeU
     teWtkOaUv+WKoeWKnuWFrOWupCxvPea1t+WNl+ecgeS6uuawkeaUv+W6nOWKnuWFrOWOhSwgYz1j
     bg==
    EncryptCertificate;binary:: MIICgzCCAg+gAwIBAgIDAPAWMAsGCSqBHIFFAYdoCzCBpDE2M
     DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
     AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
     gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
     TE2MDAwMFoXDTIwMDYxNTE1NTk1OVowgaExHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
     TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMR4wHAYDVQQLDBXnlLXlr
     ZDmlL/liqHlip7lhazlrqQxNjA0BgNVBAMMLeecgeaUv+W6nOS/oeS7u+acjeWKoeezu+e7n+WPr
     +S/oeaXtumXtOacjeWKoTB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAARjbFCPyopT/n1J510rY
     fqoWOSZ31RZ6tsi2W9ERas86OyZnOYffHN/nNJIhuP62hG+8x1GQvxRQJTtMQmG8yTf3guqCAKEV
     JvJ8YqvFjrryPr5comQFq+aCPH5DalFsbGjDzANMAsGA1UdDwQEAwID+DALBgkqgRyBRQGHaAsDY
     QDGnifEI4VCDIuCzkH4T90m/nBKsP40ERsfbgT6f959SPIOhbvT7lQg9iTru21bXHHDwP2ZLOhdr
     1jRNmguSPRHfYk9R+/CtSijvM5h/VbgbxfB8ifT27yXJYP3G+89oKo=
    EncryptnotAfter: 20200615115959
    objectClass: wstCertificateUser
    EncryptserialNumber: F016
    cn:: 55yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf5Y+v5L+h5pe26Ze05pyN5Yqh
    
    dn:: Y24955yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf5o6I5p2D566h55CG6K6+5aSHLG91PeeU
     teWtkOaUv+WKoeWKnuWFrOWupCxvPea1t+WNl+ecgeS6uuawkeaUv+W6nOWKnuWFrOWOhSwgYz1j
     bg==
    EncryptCertificate;binary:: MIICgzCCAg+gAwIBAgIDAPAXMAsGCSqBHIFFAYdoCzCBpDE2M
     DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
     AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
     gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
     TE2MDAwMFoXDTIwMDYxNTE1NTk1OVowgaExHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
     TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMR4wHAYDVQQLDBXnlLXlr
     ZDmlL/liqHlip7lhazlrqQxNjA0BgNVBAMMLeecgeaUv+W6nOS/oeS7u+acjeWKoeezu+e7n+aOi
     Oadg+euoeeQhuiuvuWkhzB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAAR9DCT3EnxjPUiNyeeLJ
     eARvaVGbLnqRykTs6g63Pz1sJ8KytUpd8u3TRmE8I6mmg62tj0CrWdRTDWlFCEjDS3nZMmRTr/OF
     +2TfdQpankZywvalhASLgWZDSw3H2y6bJOjDzANMAsGA1UdDwQEAwID+DALBgkqgRyBRQGHaAsDY
     QD3AEmWE6YuzItIvRxtqBRbMvGaI4FldYD4eS0qCa9Qpma0izzYOstdam6pBAvLMS93ArmDTlXSs
     Zvx/OEV3/ryTyZHa5moMRJRroQdEmHM1yz2aX4pTq7RFe6PLKSajwE=
    EncryptnotAfter: 20200615115959
    objectClass: wstCertificateUser
    EncryptserialNumber: F017
    cn:: 55yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf5o6I5p2D566h55CG6K6+5aSH
    
    dn:: Y24955yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf6LSj5Lu76K6k5a6a6K6+5aSHLG91PeeU
     teWtkOaUv+WKoeWKnuWFrOWupCxvPea1t+WNl+ecgeS6uuawkeaUv+W6nOWKnuWFrOWOhSwgYz1j
     bg==
    EncryptCertificate;binary:: MIICgzCCAg+gAwIBAgIDAPAYMAsGCSqBHIFFAYdoCzCBpDE2M
     DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
     AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
     gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
     TE2MDAwMFoXDTIwMDYxNTE1NTk1OVowgaExHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
     TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMR4wHAYDVQQLDBXnlLXlr
     ZDmlL/liqHlip7lhazlrqQxNjA0BgNVBAMMLeecgeaUv+W6nOS/oeS7u+acjeWKoeezu+e7n+i0o
     +S7u+iupOWumuiuvuWkhzB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAATTORploAGr0V5s+yHJH
     sP8K8tAml8SGyGhajpg6pscwhikkQCDy9uFIMyQJUiEJ8AXod86ZH/KI7XxwK2gfw7+XrjC+YZ+D
     TE/Ty7babBnOctC1Y/73dqhSoRjMw5q9J2jDzANMAsGA1UdDwQEAwID+DALBgkqgRyBRQGHaAsDY
     QA6MJjxhAMDKyBNqLhnG2vhsCPDjXcjeQkzP9H54UJKlAkqldGVlxEhCdeKoqOppg8F9CgfYdi+4
     FD4ZtKZMvd6SibC+n4Kbd/PbjaIH5gG/lt35AKLgkb79n0x+HDtMu4=
    EncryptnotAfter: 20200615115959
    objectClass: wstCertificateUser
    EncryptserialNumber: F018
    cn:: 55yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf6LSj5Lu76K6k5a6a6K6+5aSH
    
    dn:: Y24955yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf6LWE5rqQ566h55CG6K6+5aSHLG91PeeU
     teWtkOaUv+WKoeWKnuWFrOWupCxvPea1t+WNl+ecgeS6uuawkeaUv+W6nOWKnuWFrOWOhSwgYz1j
     bg==
    EncryptCertificate;binary:: MIICgzCCAg+gAwIBAgIDAPAZMAsGCSqBHIFFAYdoCzCBpDE2M
     DQGA1UEAwwt5rW35Y2X55yB55S15a2Q5pS/5Yqh5YaF572R55S15a2Q6K6k6K+B57uT54K5MTYwN
     AYDVQQKDC3mtbfljZfnnIHnlLXlrZDmlL/liqHlhoXnvZHnlLXlrZDorqTor4Hnu5PngrkxEjAQB
     gNVBAgMCea1t+WNl+ecgTEeMBwGA1UEBgwV5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9MB4XDTE3MDYxN
     TE2MDAwMFoXDTIwMDYxNTE1NTk1OVowgaExHjAcBgNVBAYMFeS4reWNjuS6uuawkeWFseWSjOWbv
     TEnMCUGA1UECgwe5rW35Y2X55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6FMR4wHAYDVQQLDBXnlLXlr
     ZDmlL/liqHlip7lhazlrqQxNjA0BgNVBAMMLeecgeaUv+W6nOS/oeS7u+acjeWKoeezu+e7n+i1h
     Oa6kOeuoeeQhuiuvuWkhzB6MBQGByqGSM49AgEGCSqBHIFFAYdoCANiAAQoMEkVxLEqNYvIaiQ/3
     eICcDMJ9/3TIdpkRP6puuwQ43TQdr/UUqPzrd0lWNtdWe35H0+ENwUNlYisBJraco/GHpw81LNRt
     zfo4okEgukL9X0tXnxyusd6z6EZJcmCvH+jDzANMAsGA1UdDwQEAwID+DALBgkqgRyBRQGHaAsDY
     QCuJ+HYlSJXSn6G5g+xF7NCjNixSO72vghDKs+O32dz3lL7jKdZ8foMJ55S7Z2HTVNLBQbwOJDv/
     /J03XeXvcuc+Bos7PTYtQHJ5tYn4rSDDrUbY+LQA1oZxoE+BQ3s7yg=
    EncryptnotAfter: 20200615115959
    objectClass: wstCertificateUser
    EncryptserialNumber: F019
    cn:: 55yB5pS/5bqc5L+h5Lu75pyN5Yqh57O757uf6LWE5rqQ566h55CG6K6+5aSH
    
    dn:: bz3lm5vlt53nnIHkurrmsJHmlL/lupzlip7lhazljoUsIGM9Y24=
    objectClass: top
    objectClass: organization
    o:: 5Zub5bed55yB5Lq65rCR5pS/5bqc5Yqe5YWs5Y6F
    
    dn:: bz3nlLXlrZDmlL/liqHlip7lhazlrqQsbz3lm5vlt53nnIHkurrmsJHmlL/lupzlip7lhazl
     joUsIGM9Y24=
    objectClass: top
    objectClass: organization
    o:: 55S15a2Q5pS/5Yqh5Yqe5YWs5a6k
    
    dn:: bz3kv53lr4blip7lhazlrqQsbz3lm5vlt53nnIHkurrmsJHmlL/lupzlip7lhazljoUsIGM9
     Y24=
    objectClass: top
    objectClass: organization
    o:: 5L+d5a+G5Yqe5YWs5a6k
    
    dn:: bz3lrqPkvKDpg6gsbz3lm5vlt53nnIHkurrmsJHmlL/lupzlip7lhazljoUsIGM9Y24=
    objectClass: top
    objectClass: organization
    o:: 5a6j5Lyg6YOo
    
    dn:: bz3mlrDpl7vlip7kuovlpIQsbz3lm5vlt53nnIHkurrmsJHmlL/lupzlip7lhazljoUsIGM9
     Y24=
    objectClass: top
    objectClass: organization
    o:: 5paw6Ze75Yqe5LqL5aSE
    
    dn:: bz3nnIHlp5Tnu4Tnu4fpg6gsbz3lm5vlt53nnIHkurrmsJHmlL/lupzlip7lhazljoUsIGM9
     Y24=
    objectClass: top
    objectClass: organization
    o:: 55yB5aeU57uE57uH6YOo
    
    dn:: bz3muZbljJfnnIHkurrmsJHmlL/liqHlip7lhazljoUsIGM9Y24=
    objectClass: top
    objectClass: organization
    o:: 5rmW5YyX55yB5Lq65rCR5pS/5Yqh5Yqe5YWs5Y6F
    
    dn:: bz3nnIHlp5TlrqPkvKDpg6gsbz3muZbljJfnnIHkurrmsJHmlL/liqHlip7lhazljoUsIGM9
     Y24=
    objectClass: top
    objectClass: organization
    o:: 55yB5aeU5a6j5Lyg6YOo
    
    dn:: bz3nnIHlp5Tkv53lr4bnnaPmn6Xnu4Qsbz3muZbljJfnnIHkurrmsJHmlL/liqHlip7lhazl
     joUsIGM9Y24=
    objectClass: top
    objectClass: organization
    o:: 55yB5aeU5L+d5a+G552j5p+l57uE
    
    dn:: bz3nnIHlp5TlpJbkuqTpg6gsbz3muZbljJfnnIHkurrmsJHmlL/liqHlip7lhazljoUsIGM9
     Y24=
    objectClass: top
    objectClass: organization
    o:: 55yB5aeU5aSW5Lqk6YOo
    
    dn:: bz3nlLXlrZDmlL/liqHlip7lhazlrqQsbz3muZbljJfnnIHkurrmsJHmlL/liqHlip7lhazl
     joUsIGM9Y24=
    objectClass: top
    objectClass: organization
    o:: 55S15a2Q5pS/5Yqh5Yqe5YWs5a6k

    最后运行LdifImport.java中的main方法,控制台输出结果为以下就说明成功了

    LDIF change file
    
    Adding entry...
    Directory information has been modified.
    
    Adding entry...
    Directory information has been modified.
    
    Adding entry...
    Directory information has been modified.
    
    Adding entry...
    Directory information has been modified.
    
    Adding entry...
    Directory information has been modified.
    
    Adding entry...
    Directory information has been modified.
    
    Adding entry...
    Directory information has been modified.
    
    Adding entry...
    changetype: attribute type undefined
    
    Adding entry...
    
    
    Adding entry...
    Directory information has been modified.
    
    Adding entry...
    changetype: attribute type undefined
    
    Adding entry...
    
    
    Adding entry...
    Directory information has been modified.
    
    Adding entry...
    
    
    Adding entry...
    Directory information has been modified.
    
    Adding entry...
    Directory information has been modified.
    
    Adding entry...
    Directory information has been modified.
    
    Adding entry...
    Directory information has been modified.
    
    Adding entry...
    
    
    Adding entry...
    Directory information has been modified.
    
    Adding entry...
    Directory information has been modified.
    
    Adding entry...
    Directory information has been modified.
    
    Adding entry...
    Directory information has been modified.
    
    Adding entry...
    Directory information has been modified.
    
    Adding entry...
    Directory information has been modified.
    
    Adding entry...
    Directory information has been modified.
    
    Adding entry...
    Directory information has been modified.
    
    Adding entry...
    Directory information has been modified.
    
    Adding entry...
    Directory information has been modified.
    
    Adding entry...
    Directory information has been modified.
    
    Adding entry...
    Directory information has been modified.
    
    Adding entry...
    Directory information has been modified.
    
    Adding entry...
    Directory information has been modified.
    
    Adding entry...
    Directory information has been modified.
    
    Adding entry...
    Directory information has been modified.
    
    Adding entry...
    Directory information has been modified.
    
    Adding entry...
    Directory information has been modified.
    
    Adding entry...
    Directory information has been modified.
    
    Adding entry...
    Directory information has been modified.
    
    Adding entry...
    Directory information has been modified.
    
    Adding entry...
    Directory information has been modified.
  • 相关阅读:
    Thinkphp注释
    THINKPHP5 如何在 控制器内调用model模型
    thinkphp5路由定义
    Thinkphp5读取当前config配置文件
    thinkphp5计算代码块的性能
    thinkphp的执行流程
    php filter过滤器
    nginx在收到stop信号后的处理
    寻找重复数
    奶牛和公牛
  • 原文地址:https://www.cnblogs.com/dqcer/p/7682154.html
Copyright © 2011-2022 走看看