package com.l7tech.common.io;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.SocketException;
import java.net.SocketOption;
import java.nio.channels.SocketChannel;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;

public class SocketWrapper extends Socket {
   private final Socket a;

   public SocketWrapper(Socket var1) {
      this.a = var1;
   }

   @Override
   public void connect(SocketAddress var1) throws IOException {
      this.a.connect(var1);
   }

   @Override
   public void connect(SocketAddress var1, int var2) throws IOException {
      this.a.connect(var1, var2);
   }

   @Override
   public void bind(SocketAddress var1) throws IOException {
      this.a.bind(var1);
   }

   @Override
   public InetAddress getInetAddress() {
      return this.a.getInetAddress();
   }

   @Override
   public InetAddress getLocalAddress() {
      return this.a.getLocalAddress();
   }

   @Override
   public int getPort() {
      return this.a.getPort();
   }

   @Override
   public int getLocalPort() {
      return this.a.getLocalPort();
   }

   @Override
   public SocketAddress getRemoteSocketAddress() {
      return this.a.getRemoteSocketAddress();
   }

   @Override
   public SocketAddress getLocalSocketAddress() {
      return this.a.getLocalSocketAddress();
   }

   @Override
   public SocketChannel getChannel() {
      return this.a.getChannel();
   }

   @Override
   public InputStream getInputStream() throws IOException {
      return this.a.getInputStream();
   }

   @Override
   public OutputStream getOutputStream() throws IOException {
      return this.a.getOutputStream();
   }

   @Override
   public void setTcpNoDelay(boolean var1) throws SocketException {
      this.a.setTcpNoDelay(var1);
   }

   @Override
   public boolean getTcpNoDelay() throws SocketException {
      return this.a.getTcpNoDelay();
   }

   @Override
   public void setSoLinger(boolean var1, int var2) throws SocketException {
      this.a.setSoLinger(var1, var2);
   }

   @Override
   public int getSoLinger() throws SocketException {
      return this.a.getSoLinger();
   }

   @Override
   public void sendUrgentData(int var1) throws IOException {
      this.a.sendUrgentData(var1);
   }

   @Override
   public void setOOBInline(boolean var1) throws SocketException {
      this.a.setOOBInline(var1);
   }

   @Override
   public boolean getOOBInline() throws SocketException {
      return this.a.getOOBInline();
   }

   @Override
   public void setSoTimeout(int var1) throws SocketException {
      this.a.setSoTimeout(var1);
   }

   @Override
   public int getSoTimeout() throws SocketException {
      return this.a.getSoTimeout();
   }

   @Override
   public void setSendBufferSize(int var1) throws SocketException {
      this.a.setSendBufferSize(var1);
   }

   @Override
   public int getSendBufferSize() throws SocketException {
      return this.a.getSendBufferSize();
   }

   @Override
   public void setReceiveBufferSize(int var1) throws SocketException {
      this.a.setReceiveBufferSize(var1);
   }

   @Override
   public int getReceiveBufferSize() throws SocketException {
      return this.a.getReceiveBufferSize();
   }

   @Override
   public void setKeepAlive(boolean var1) throws SocketException {
      this.a.setKeepAlive(var1);
   }

   @Override
   public boolean getKeepAlive() throws SocketException {
      return this.a.getKeepAlive();
   }

   @Override
   public void setTrafficClass(int var1) throws SocketException {
      this.a.setTrafficClass(var1);
   }

   @Override
   public int getTrafficClass() throws SocketException {
      return this.a.getTrafficClass();
   }

   @Override
   public void setReuseAddress(boolean var1) throws SocketException {
      this.a.setReuseAddress(var1);
   }

   @Override
   public boolean getReuseAddress() throws SocketException {
      return this.a.getReuseAddress();
   }

   @Override
   public void close() throws IOException {
      this.a.close();
   }

   @Override
   public void shutdownInput() throws IOException {
      this.a.shutdownInput();
   }

   @Override
   public void shutdownOutput() throws IOException {
      this.a.shutdownOutput();
   }

   @Override
   public String toString() {
      return this.a.toString();
   }

   @Override
   public boolean isConnected() {
      return this.a.isConnected();
   }

   @Override
   public boolean isBound() {
      return this.a.isBound();
   }

   @Override
   public boolean isClosed() {
      return this.a.isClosed();
   }

   @Override
   public boolean isInputShutdown() {
      return this.a.isInputShutdown();
   }

   @Override
   public boolean isOutputShutdown() {
      return this.a.isOutputShutdown();
   }

   @Override
   public void setPerformancePreferences(int var1, int var2, int var3) {
      this.a.setPerformancePreferences(var1, var2, var3);
   }

   @Override
   public <T> Socket setOption(SocketOption<T> var1, T var2) throws IOException {
      return this.a.setOption(var1, var2);
   }

   @Override
   public <T> T getOption(SocketOption<T> var1) throws IOException {
      return this.a.getOption(var1);
   }

   @Override
   public Set<SocketOption<?>> supportedOptions() {
      return this.a.supportedOptions();
   }

   public static class TraceSupport {
      private final Socket a;
      private final String b;
      private final Logger c;
      private InputStream d;
      private OutputStream e;
      private static final String[] f;

      public TraceSupport(Socket var1, String var2, Logger var3) {
         this.a = var1;
         this.b = var2;
         this.c = var3;
      }

      public InputStream getInputStream() throws IOException {
         InputStream var1 = this.d;

         label23: {
            label22: {
               try {
                  if (var1 != null) {
                     return var1;
                  }

                  if (this.c.isLoggable(Level.FINEST)) {
                     break label22;
                  }
               } catch (IOException var2) {
                  throw a(var2);
               }

               var1 = this.a.getInputStream();
               break label23;
            }

            var1 = new HexLoggingInputStream(this.b + f[1], this.c, this.a.getInputStream());
         }

         this.d = var1;
         return var1;
      }

      public OutputStream getOutputStream() throws IOException {
         OutputStream var1 = this.e;

         label23: {
            label22: {
               try {
                  if (var1 != null) {
                     return var1;
                  }

                  if (this.c.isLoggable(Level.FINEST)) {
                     break label22;
                  }
               } catch (IOException var2) {
                  throw a(var2);
               }

               var1 = this.a.getOutputStream();
               break label23;
            }

            var1 = new HexLoggingOutputStream(this.b + f[0], this.c, this.a.getOutputStream());
         }

         this.e = var1;
         return var1;
      }

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

      static {
         String[] var5 = new String[2];
         int var3 = 0;
         String var2 = "_Tuz\u0005\u0004_Rn\u0004";
         int var4 = "_Tuz\u0005\u0004_Rn\u0004".length();
         char var1 = 5;
         int var0 = -1;

         while (true) {
            String var10002 = a(109, a(var2.substring(++var0, var0 + var1)));
            byte var10001 = -1;
            var5[var3++] = var10002;
            if ((var0 += var1) >= var4) {
               f = var5;
               return;
            }

            var1 = var2.charAt(var0);
         }
      }

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

         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 -> 31;
               case 1 -> 86;
               case 2 -> 109;
               case 3 -> 99;
               case 4 -> 98;
               case 5 -> 86;
               default -> 102;
            });
         }

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