package com.l7tech.server.identity.ldap;

import com.l7tech.common.io.CertUtils;
import com.l7tech.identity.IdentityProviderConfigManager;
import com.l7tech.identity.ldap.LdapIdentityProviderConfig;
import com.l7tech.identity.ldap.UserMappingConfig;
import com.l7tech.identity.ldap.LdapIdentityProviderConfig.UserCertificateUseType;
import com.l7tech.objectmodel.FindException;
import com.l7tech.server.Lifecycle;
import com.l7tech.server.util.ManagedTimer;
import com.l7tech.server.util.ManagedTimerTask;
import com.l7tech.util.ExceptionUtils;
import com.l7tech.util.Pair;
import com.l7tech.util.Functions.NullaryVoidThrows;
import java.math.BigInteger;
import java.security.cert.CertificateEncodingException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;
import java.util.concurrent.atomic.AtomicReference;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.NamingException;
import javax.naming.directory.SearchControls;
import javax.security.auth.x500.X500Principal;

class LdapCertificateCache implements Lifecycle {
   private static final Logger a;
   private final AtomicReference<c> b = new AtomicReference<>(new c());
   private final HashMap<LdapCertificateCache.CertCacheKey, b> c = new HashMap<>();
   private final ReentrantReadWriteLock d = new ReentrantReadWriteLock();
   private final IdentityProviderConfigManager e;
   private final LdapIdentityProviderConfig f;
   private final LdapRuntimeConfig g;
   private final ad h;
   private final Set<String> i;
   private final ManagedTimer j;
   private final String k;
   private ManagedTimerTask l;
   private ManagedTimerTask m;
   private static final String[] n;

   @Override
   public void start() {
      this.a(this.l, true, this.g.getRebuildTimerLength());
      this.a(this.m, false, this.g.getCleanupTimerLength());
   }

   @Override
   public void stop() {
      this.a(this.l, this.m);
   }

   LdapCertificateCache(
      LdapIdentityProviderConfig var1, IdentityProviderConfigManager var2, LdapRuntimeConfig var3, ad var4, Set<String> var5, String var6, boolean var7
   ) {
      this.j = new ManagedTimer(n[6]);
      this.f = var1;
      this.e = var2;
      this.g = var3;
      this.h = var4;
      this.i = var5;
      this.k = var6;
      if (var7) {
         this.l = new ai(this, var3, var6);
      }

      this.m = new ah(this, var6);
   }

   X509Certificate a(String var1) {
      X509Certificate var2 = null;
      c var3 = this.b.get();
      LdapCertificateCache.CertCacheKey var4 = var3.getCertCacheKeyBySki(var1);
      if (var4 != null) {
         Pair var5 = this.a(var4);
         var2 = var5 == null ? null : (X509Certificate)var5.right;
      }

      return var2;
   }

   X509Certificate a(X500Principal var1, BigInteger var2) {
      X509Certificate var3 = null;
      c var4 = this.b.get();
      LdapCertificateCache.CertCacheKey var5 = var4.getCertCacheKeyByIssuerAndSerial(var1, var2);
      if (var5 != null) {
         Pair var6 = this.a(var5);
         var3 = var6 == null ? null : (X509Certificate)var6.right;
      }

      return var3;
   }

   X509Certificate b(String var1) throws FindException {
      X509Certificate var2 = null;
      c var3 = this.b.get();
      LdapCertificateCache.CertCacheKey var4 = var3.getCertCacheKeyByThumbprintSHA1(var1);
      if (var4 != null) {
         Pair var5 = this.a(var4);

         X509Certificate var10000;
         label19: {
            try {
               if (var5 == null) {
                  var10000 = null;
                  break label19;
               }
            } catch (FindException var6) {
               throw a(var6);
            }

            var10000 = (X509Certificate)var5.right;
         }

         var2 = var10000;
      }

      return var2;
   }

   X509Certificate a(X500Principal var1) {
      X509Certificate var2 = null;
      c var3 = this.b.get();
      LdapCertificateCache.CertCacheKey var4 = var3.getCertCacheKeyByCanonicalSubjectDn(CertUtils.getDN(var1));
      if (var4 != null) {
         Pair var5 = this.a(var4);
         var2 = var5 == null ? null : (X509Certificate)var5.right;
      }

      return var2;
   }

   String a(X509Certificate var1) throws FindException, CertificateEncodingException {
      String var2 = null;
      c var3 = this.b.get();
      LdapCertificateCache.CertCacheKey var4 = var3.getCertCacheKeyByThumbprintSHA1(CertUtils.getThumbprintSHA1(var1));
      if (var4 != null) {
         Pair var5 = this.a(var4);

         String var10000;
         label19: {
            try {
               if (var5 == null) {
                  var10000 = null;
                  break label19;
               }
            } catch (FindException var6) {
               throw a(var6);
            }

            var10000 = (String)var5.left;
         }

         var2 = var10000;
      }

      return var2;
   }

   void a(X500Principal var1, BigInteger var2, String var3) {
      c var4 = this.b.get();
      var4.removeIndex(var1, var2, var3);
   }

   void a(String var1, X509Certificate[] var2) throws CertificateException {
      c var3 = this.b.get();
      HashMap var4 = new HashMap();

      for (X509Certificate var8 : var2) {
         LdapCertificateCache.CertCacheKey var9 = var3.addCertificateToIndexes(var1, var8);

         try {
            if (var9 != null) {
               var4.put(var9, new b(var1, var8));
            }
         } catch (CertificateException var14) {
            throw a(var14);
         }
      }

      for (LdapCertificateCache.CertCacheKey var16 : var4.keySet()) {
         a.fine(n[8] + var16);
      }

      this.d.writeLock().lock();

      try {
         this.c.putAll(var4);
      } finally {
         this.d.writeLock().unlock();
      }
   }

   private boolean a() {
      // $VF: Couldn't be decompiled
      // Please report this to the Vineflower issue tracker, at https://github.com/Vineflower/vineflower/issues with a copy of the class file (if you have the rights to distribute it!)
      // java.lang.RuntimeException: parsing failure!
      //   at org.jetbrains.java.decompiler.modules.decompiler.decompose.DomHelper.parseGraph(DomHelper.java:211)
      //   at org.jetbrains.java.decompiler.main.rels.MethodProcessor.codeToJava(MethodProcessor.java:174)
      //
      // Bytecode:
      // 00: aload 0
      // 01: getfield com/l7tech/server/identity/ldap/LdapCertificateCache.e Lcom/l7tech/identity/IdentityProviderConfigManager;
      // 04: ifnonnull 1a
      // 07: getstatic com/l7tech/server/identity/ldap/LdapCertificateCache.a Ljava/util/logging/Logger;
      // 0a: getstatic com/l7tech/server/identity/ldap/LdapCertificateCache.n [Ljava/lang/String;
      // 0d: bipush 10
      // 0f: aaload
      // 10: invokevirtual java/util/logging/Logger.warning (Ljava/lang/String;)V
      // 13: goto 71
      // 16: invokestatic com/l7tech/server/identity/ldap/LdapCertificateCache.a (Ljava/lang/Exception;)Ljava/lang/Exception;
      // 19: athrow
      // 1a: aload 0
      // 1b: getfield com/l7tech/server/identity/ldap/LdapCertificateCache.e Lcom/l7tech/identity/IdentityProviderConfigManager;
      // 1e: aload 0
      // 1f: getfield com/l7tech/server/identity/ldap/LdapCertificateCache.f Lcom/l7tech/identity/ldap/LdapIdentityProviderConfig;
      // 22: invokevirtual com/l7tech/identity/ldap/LdapIdentityProviderConfig.getGoid ()Lcom/l7tech/objectmodel/Goid;
      // 25: invokeinterface com/l7tech/identity/IdentityProviderConfigManager.findByPrimaryKey (Lcom/l7tech/objectmodel/Goid;)Lcom/l7tech/objectmodel/PersistentEntity; 2
      // 2a: checkcast com/l7tech/identity/IdentityProviderConfig
      // 2d: astore 1
      // 2e: aload 1
      // 2f: ifnull 47
      // 32: aload 1
      // 33: invokevirtual com/l7tech/identity/IdentityProviderConfig.getVersion ()I
      // 36: aload 0
      // 37: getfield com/l7tech/server/identity/ldap/LdapCertificateCache.f Lcom/l7tech/identity/ldap/LdapIdentityProviderConfig;
      // 3a: invokevirtual com/l7tech/identity/ldap/LdapIdentityProviderConfig.getVersion ()I
      // 3d: if_icmpeq 4f
      // 40: goto 47
      // 43: invokestatic com/l7tech/server/identity/ldap/LdapCertificateCache.a (Ljava/lang/Exception;)Ljava/lang/Exception;
      // 46: athrow
      // 47: bipush 1
      // 48: goto 50
      // 4b: invokestatic com/l7tech/server/identity/ldap/LdapCertificateCache.a (Ljava/lang/Exception;)Ljava/lang/Exception;
      // 4e: athrow
      // 4f: bipush 0
      // 50: ireturn
      // 51: astore 1
      // 52: getstatic com/l7tech/server/identity/ldap/LdapCertificateCache.a Ljava/util/logging/Logger;
      // 55: getstatic java/util/logging/Level.WARNING Ljava/util/logging/Level;
      // 58: aload 0
      // 59: getfield com/l7tech/server/identity/ldap/LdapCertificateCache.f Lcom/l7tech/identity/ldap/LdapIdentityProviderConfig;
      // 5c: invokestatic java/lang/String.valueOf (Ljava/lang/Object;)Ljava/lang/String;
      // 5f: getstatic com/l7tech/server/identity/ldap/LdapCertificateCache.n [Ljava/lang/String;
      // 62: bipush 3
      // 63: aaload
      // 64: swap
      // 65: invokedynamic makeConcatWithConstants (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; bsm=java/lang/invoke/StringConcatFactory.makeConcatWithConstants (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; args=[ "\u0001\u0001" ]
      // 6a: aload 1
      // 6b: invokestatic com/l7tech/util/ExceptionUtils.getDebugException (Ljava/lang/Throwable;)Ljava/lang/Throwable;
      // 6e: invokevirtual java/util/logging/Logger.log (Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/Throwable;)V
      // 71: bipush 0
      // 72: ireturn
      // try (21 -> 32): 32 com/l7tech/objectmodel/FindException
      // try (19 -> 27): 28 com/l7tech/objectmodel/FindException
      // try (0 -> 9): 9 com/l7tech/objectmodel/FindException
      // try (11 -> 35): 36 com/l7tech/objectmodel/FindException
   }

   private void a(ManagedTimerTask var1, boolean var2, long var3) {
      if (var1 != null) {
         this.j.schedule(var1, var2 ? 0L : 5000L, var3);
      }
   }

   private void a(ManagedTimerTask... var1) {
      for (ManagedTimerTask var5 : var1) {
         if (var5 != null) {
            var5.cancel();
         }
      }
   }

   private void b() {
      this.a(this.l);
      this.l = new ai(this, this.g, this.k);
      this.a(this.l, false, this.g.getRebuildTimerLength());
   }

   private void c() {
      ArrayList var1 = new ArrayList();
      long var2 = System.currentTimeMillis();
      this.d.readLock().lock();

      try {
         for (LdapCertificateCache.CertCacheKey var6 : this.c.keySet()) {
            b var7 = this.c.get(var6);
            if (var2 - var7.c > this.g.getCachedCertEntryLife()) {
               var1.add(var6);
            }
         }
      } finally {
         this.d.readLock().unlock();
      }

      if (var1.size() > 0) {
         this.d.writeLock().lock();

         try {
            for (LdapCertificateCache.CertCacheKey var18 : var1) {
               Logger var10000 = a;
               String var10001 = String.valueOf(var18);
               String[] var10 = n;
               var10000.fine(var10[14] + var10001 + var10[0]);
               this.c.remove(var18);
            }
         } finally {
            this.d.writeLock().unlock();
         }
      }
   }

   private Pair<String, X509Certificate> a(LdapCertificateCache.CertCacheKey var1) {
      AtomicReference var2 = new AtomicReference();
      this.d.readLock().lock();

      try {
         b var3 = this.c.get(var1);

         try {
            if (var3 != null) {
               var2.set(new Pair(var3.a, var3.b));
            }
         } catch (Exception var21) {
            throw a(var21);
         }
      } finally {
         this.d.readLock().unlock();
      }

      try {
         if (var2.get() != null) {
            a.fine(n[5] + var1 + n[17]);
            return (Pair<String, X509Certificate>)var2.get();
         }
      } catch (Exception var24) {
         throw a(var24);
      }

      try {
         UserMappingConfig[] var25 = this.f.getUserMappings();
         this.h.a((String)var1.getKey(), new l(this, var25, var1, var2));
      } catch (Exception var20) {
         Logger var10000 = a;
         Level var10001 = Level.WARNING;
         String var10002 = String.valueOf(var1);
         String[] var6 = n;
         var10000.log(var10001, var6[4] + var10002, var20);
      }

      try {
         if (var2.get() == null) {
            a.fine(n[16] + var1 + ")");
            return (Pair<String, X509Certificate>)var2.get();
         }
      } catch (Exception var23) {
         throw a(var23);
      }

      a.fine(n[12] + var1);
      this.d.writeLock().lock();

      try {
         this.c.put(var1, new b((String)((Pair)var2.get()).left, (X509Certificate)((Pair)var2.get()).right));
      } finally {
         this.d.writeLock().unlock();
      }

      return (Pair<String, X509Certificate>)var2.get();
   }

   private void d() {
      try {
         this.a(new a(this));
      } catch (NamingException var3) {
         Logger var10000 = a;
         Level var10001 = Level.WARNING;
         String var10002 = this.f.getName();
         String var10003 = ExceptionUtils.getMessage(var3);
         String[] var2 = n;
         var10000.log(var10001, var2[11] + var10002 + var2[7] + var10003, ExceptionUtils.getDebugException(var3));
      }
   }

   private void e() {
      Logger var10000 = a;
      String var10001 = this.f.getName();
      String[] var7 = n;
      var10000.fine(var7[1] + var10001);
      c var1 = new c(new HashMap<>(), new HashMap<>(), new HashMap<>(), new HashMap<>(), false);

      try {
         String var2 = null;
         if (this.f.getUserCertificateUseType() == UserCertificateUseType.INDEX) {
            h var3 = new h();

            label71: {
               try {
                  if (this.i.size() > 1) {
                     var17 = true;
                     break label71;
                  }
               } catch (Exception var11) {
                  throw a(var11);
               }

               var17 = false;
            }

            boolean var4 = var17;

            try {
               if (var4) {
                  var3.or();
               }
            } catch (Exception var10) {
               throw a(var10);
            }

            for (String var6 : this.i) {
               var3.attrPresent(var6);
            }

            try {
               if (var4) {
                  var3.end();
               }
            } catch (Exception var8) {
               throw a(var8);
            }

            label51: {
               try {
                  if (var3.isEmpty()) {
                     var18 = null;
                     break label51;
                  }
               } catch (Exception var9) {
                  throw a(var9);
               }

               var18 = var3.buildFilter();
            }

            var2 = var18;
         } else if (this.f.getUserCertificateUseType() == UserCertificateUseType.INDEX_CUSTOM) {
            var2 = this.f.getUserCertificateIndexSearchFilter();
         }

         if (var2 != null) {
            var7 = n;
            a.fine(var7[9] + var2 + var7[0]);
            SearchControls var13 = new SearchControls();
            var13.setSearchScope(2);
            var13.setReturningAttributes(this.i.toArray(new String[this.i.size()]));
            this.h.a(var2, 0L, this.i, new m(this, var1));
            this.b.set(var1.immutable());
            a.fine(var7[13] + var1.describe() + var7[0]);
         }
      } catch (Exception var12) {
         var10000 = a;
         Level var19 = Level.WARNING;
         String var10002 = this.f.getName();
         String var10003 = ExceptionUtils.getMessage(var12);
         var7 = n;
         var10000.log(var19, var7[2] + var10002 + var7[15] + var10003, ExceptionUtils.getDebugException(var12));
      }
   }

   private void a(NullaryVoidThrows<NamingException> var1) throws NamingException {
      ClassLoader var2 = Thread.currentThread().getContextClassLoader();

      try {
         Thread.currentThread().setContextClassLoader(LdapSslCustomizerSupport.getSSLSocketFactoryClassLoader());
         var1.call();
      } finally {
         Thread.currentThread().setContextClassLoader(var2);
      }
   }

   static {
      String[] var5 = new String[18];
      int var3 = 0;
      String var2 = "@P,5\u001bfT\u0005\u0002t\u0013\u0017%PW\u000bq\u0006\u000ekB\u0004\u0002gG\u001d.E\u0003\u000es\u000e\u001d*C\u0012G|\t\u001a.OW\u0001z\u0015^F\"\f9X\u0005Gb\u000f\u0017'RW\u0015p\u0004\f.V\u0003\u000e{\u0000^'S\u0016\u00175\u0012\r.EW\u0004p\u0015\n\"Q\u001e\u0004t\u0013\u001bk^\u0019\u0003p\u001f^-X\u0005GY#?\u001b\u0017'\u0015z\u0011\u0017/R\u0005G2*\"\f9X\u0005Gv\u000f\u001b(\\\u001e\trG\u0017/R\u0019\u0013|\u0013\u0007kT\u0018\ts\u000e\u0019>E\u0016\u0013|\b\u0010kQ\u0018\u00155*\"\f9X\u0005Gy\b\u0011 ^\u0019\u00005\u0012\u000ekT\u0012\u0015a\u000e\u0018\"T\u0016\u0013pG\u0017%\u0017\u0013\u000eg\u0002\u001d?X\u0005\u001e5\u0015$\u001b9CW\u0001z\u0012\u0010/\u0017\u001e\t5\u0004\u001f(_\u0012G2\u001c+:\ngW$p\u0015\n\"Q\u001e\u0004t\u0013\u001bkt\u0016\u0004}\u0002^\u001f^\u001a\u0002g\u0003@Dk\u0011$\u001f(_\u001e\trG\u001d.E\u0003Gs\b\fk(+:\ngW\u0012f\u0002\fkT\u0012\u0015a\u000e\u0018\"T\u0016\u0013pG\r.V\u0005\u0004}G\u0018\"[\u0003\u0002gG\u00178\u0017P\u0017$\u0011%Q\u001e\u00005*\u001f%V\u0010\u0002gG\u00178\u0017\u0019\u0012y\u000bPF\"\f9X\u0005Gb\u000f\u0017'RW\u0015p\u0004\f.V\u0003\u000e{\u0000^'S\u0016\u00175\u0012\r.EW\u0004p\u0015\n\"Q\u001e\u0004t\u0013\u001bk^\u0019\u0003p\u001f^-X\u0005GY#?\u001b\u0017'\u0015z\u0011\u0017/R\u0005G2\u0011$\u001f(_\u001e\trG\u001d.E\u0003Gs\b\fk%+:\ngW\u0012f\u0002\fkT\u0012\u0015a\u000e\u0018\"T\u0016\u0013pG\u0017%S\u0012\u001f5\u0015\u001b)B\u001e\u000baGY!5\u001b&X\u0001\u000e{\u0000^(R\u0005\u0013|\u0001\u0017(V\u0003\u00025\u0001\f$ZW\u0004t\u0004\u0016.\u0017P\u0003@Dk";
      int var4 = "@P,5\u001bfT\u0005\u0002t\u0013\u0017%PW\u000bq\u0006\u000ekB\u0004\u0002gG\u001d.E\u0003\u000es\u000e\u001d*C\u0012G|\t\u001a.OW\u0001z\u0015^F\"\f9X\u0005Gb\u000f\u0017'RW\u0015p\u0004\f.V\u0003\u000e{\u0000^'S\u0016\u00175\u0012\r.EW\u0004p\u0015\n\"Q\u001e\u0004t\u0013\u001bk^\u0019\u0003p\u001f^-X\u0005GY#?\u001b\u0017'\u0015z\u0011\u0017/R\u0005G2*\"\f9X\u0005Gv\u000f\u001b(\\\u001e\trG\u0017/R\u0019\u0013|\u0013\u0007kT\u0018\ts\u000e\u0019>E\u0016\u0013|\b\u0010kQ\u0018\u00155*\"\f9X\u0005Gy\b\u0011 ^\u0019\u00005\u0012\u000ekT\u0012\u0015a\u000e\u0018\"T\u0016\u0013pG\u0017%\u0017\u0013\u000eg\u0002\u001d?X\u0005\u001e5\u0015$\u001b9CW\u0001z\u0012\u0010/\u0017\u001e\t5\u0004\u001f(_\u0012G2\u001c+:\ngW$p\u0015\n\"Q\u001e\u0004t\u0013\u001bkt\u0016\u0004}\u0002^\u001f^\u001a\u0002g\u0003@Dk\u0011$\u001f(_\u001e\trG\u001d.E\u0003Gs\b\fk(+:\ngW\u0012f\u0002\fkT\u0012\u0015a\u000e\u0018\"T\u0016\u0013pG\r.V\u0005\u0004}G\u0018\"[\u0003\u0002gG\u00178\u0017P\u0017$\u0011%Q\u001e\u00005*\u001f%V\u0010\u0002gG\u00178\u0017\u0019\u0012y\u000bPF\"\f9X\u0005Gb\u000f\u0017'RW\u0015p\u0004\f.V\u0003\u000e{\u0000^'S\u0016\u00175\u0012\r.EW\u0004p\u0015\n\"Q\u001e\u0004t\u0013\u001bk^\u0019\u0003p\u001f^-X\u0005GY#?\u001b\u0017'\u0015z\u0011\u0017/R\u0005G2\u0011$\u001f(_\u001e\trG\u001d.E\u0003Gs\b\fk%+:\ngW\u0012f\u0002\fkT\u0012\u0015a\u000e\u0018\"T\u0016\u0013pG\u0017%S\u0012\u001f5\u0015\u001b)B\u001e\u000baGY!5\u001b&X\u0001\u000e{\u0000^(R\u0005\u0013|\u0001\u0017(V\u0003\u00025\u0001\f$ZW\u0004t\u0004\u0016.\u0017P\u0003@Dk"
         .length();
      char var1 = 2;
      int var7 = -1;

      label24:
      while (true) {
         byte var10000 = 39;
         String var10001 = var2.substring(++var7, var7 + var1);
         byte var10002 = -1;

         while (true) {
            String var8 = a(var10000, c(var10001));
            switch (var10002) {
               case 0:
                  var5[var3++] = var8;
                  if ((var7 += var1) >= var4) {
                     n = var5;
                     a = Logger.getLogger(LdapCertificateCache.class.getName());
                     return;
                  }

                  var1 = var2.charAt(var7);
                  break;
               default:
                  var5[var3++] = var8;
                  if ((var7 += var1) < var4) {
                     var1 = var2.charAt(var7);
                     continue label24;
                  }

                  var2 = "tKi\u0013NQ,TOo\u0002\u0007^6\u0017GuGS_ \u0017Gu\u0003BOeU[oGIX1\u0017GuGC^7RMo\bUNe\u001f\u0002\u0010\u0000";
                  var4 = "tKi\u0013NQ,TOo\u0002\u0007^6\u0017GuGS_ \u0017Gu\u0003BOeU[oGIX1\u0017GuGC^7RMo\bUNe\u001f\u0002\u0010\u0000".length();
                  var1 = '2';
                  var7 = -1;
            }

            var10000 = 119;
            var10001 = var2.substring(++var7, var7 + var1);
            var10002 = 0;
         }
      }
   }

   private static Exception a(Exception var0) {
      return var0;
   }

   private static char[] c(String var0) {
      char[] var10000 = var0.toCharArray();
      if (var10000.length < 2) {
         var10000[0] = (char)(var10000[0] ^ 50);
      }

      return var10000;
   }

   private static String a(int var0, char[] var1) {
      int var10003 = var1.length;
      int var10002 = var0;
      char[] var10001 = var1;
      int var10000 = var10003;

      for (int var2 = 0; var10000 > var2; var2++) {
         var10001[var2] = (char)(var10001[var2] ^ var10002 ^ switch (var2 % 7) {
            case 0 -> 64;
            case 1 -> 89;
            case 2 -> 108;
            case 3 -> 16;
            case 4 -> 80;
            case 5 -> 64;
            default -> 50;
         });
      }

      return new String(var10001).intern();
   }

   private static final class CertCacheKey extends Pair<String, String> {
      static final long serialVersionUID = 8776812752305628937L;

      public CertCacheKey(String var1, String var2) {
         super(var1, var2);
      }
   }
}
