2026-03-17 13:31:18 -07:00

706 lines
29 KiB
Java

/*
* Decompiled with CFR 0.152.
*
* Could not load the following classes:
* com.tridium.crypto.core.cert.NX509CertificateEntry
* com.tridium.crypto.core.io.ICoreKeyStore
* com.tridium.crypto.core.util.FriendlyPemReader
* com.tridium.nre.util.PlatformUtil
* com.tridium.platform.ui.util.BCommandBoundTable
* com.tridium.platform.ui.util.CommandBindings$Support
* com.tridium.platform.ui.util.CommandUtil
* com.tridium.ui.theme.Theme
* javax.baja.file.BIFile
* javax.baja.file.IFileFilter
* javax.baja.gx.BImage
* javax.baja.log.Log
* javax.baja.naming.BOrd
* javax.baja.net.NotConnectedException
* javax.baja.nre.util.Array
* javax.baja.nre.util.IntHashMap
* javax.baja.nre.util.IntHashMap$Iterator
* javax.baja.nre.util.SortUtil
* javax.baja.sys.BValue
* javax.baja.sys.Sys
* javax.baja.sys.Type
* javax.baja.ui.BDialog
* javax.baja.ui.BLabel
* javax.baja.ui.BWidget
* javax.baja.ui.Command
* javax.baja.ui.CommandArtifact
* javax.baja.ui.file.BFileChooser
* javax.baja.ui.file.ExtFileFilter
* javax.baja.ui.pane.BGridPane
* javax.baja.ui.table.DynamicTableModel
* javax.baja.ui.table.TableModel
* javax.baja.util.Lexicon
* javax.baja.workbench.util.BNotifyPane
* org.bouncycastle.cert.X509CertificateHolder
* org.bouncycastle.cert.jcajce.JcaX509CertificateConverter
* org.bouncycastle.jce.provider.BouncyCastleProvider
* org.bouncycastle.openssl.EncryptionException
* org.bouncycastle.openssl.PEMDecryptorProvider
* org.bouncycastle.openssl.PEMEncryptedKeyPair
* org.bouncycastle.openssl.PEMKeyPair
* org.bouncycastle.openssl.PEMParser
* org.bouncycastle.openssl.PasswordException
* org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter
* org.bouncycastle.openssl.jcajce.JcePEMDecryptorProviderBuilder
*/
package com.tridium.platcrypto.ui;
import com.tridium.crypto.core.cert.NX509CertificateEntry;
import com.tridium.crypto.core.io.ICoreKeyStore;
import com.tridium.crypto.core.util.FriendlyPemReader;
import com.tridium.nre.util.PlatformUtil;
import com.tridium.platcrypto.ui.BCertEntryViewDialog;
import com.tridium.platcrypto.ui.BTrustCertsTable;
import com.tridium.platcrypto.ui.PrivateKeyPasswordFinder;
import com.tridium.platform.ui.util.BCommandBoundTable;
import com.tridium.platform.ui.util.CommandBindings;
import com.tridium.platform.ui.util.CommandUtil;
import com.tridium.ui.theme.Theme;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.security.KeyPair;
import java.security.PrivateKey;
import java.security.Provider;
import java.security.cert.X509Certificate;
import java.util.Enumeration;
import javax.baja.file.BIFile;
import javax.baja.file.IFileFilter;
import javax.baja.gx.BImage;
import javax.baja.log.Log;
import javax.baja.naming.BOrd;
import javax.baja.net.NotConnectedException;
import javax.baja.nre.util.Array;
import javax.baja.nre.util.IntHashMap;
import javax.baja.nre.util.SortUtil;
import javax.baja.sys.BValue;
import javax.baja.sys.Sys;
import javax.baja.sys.Type;
import javax.baja.ui.BDialog;
import javax.baja.ui.BLabel;
import javax.baja.ui.BWidget;
import javax.baja.ui.Command;
import javax.baja.ui.CommandArtifact;
import javax.baja.ui.file.BFileChooser;
import javax.baja.ui.file.ExtFileFilter;
import javax.baja.ui.pane.BGridPane;
import javax.baja.ui.table.DynamicTableModel;
import javax.baja.ui.table.TableModel;
import javax.baja.util.Lexicon;
import javax.baja.workbench.util.BNotifyPane;
import org.bouncycastle.cert.X509CertificateHolder;
import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.openssl.EncryptionException;
import org.bouncycastle.openssl.PEMDecryptorProvider;
import org.bouncycastle.openssl.PEMEncryptedKeyPair;
import org.bouncycastle.openssl.PEMKeyPair;
import org.bouncycastle.openssl.PEMParser;
import org.bouncycastle.openssl.PasswordException;
import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
import org.bouncycastle.openssl.jcajce.JcePEMDecryptorProviderBuilder;
/*
* Illegal identifiers - consider using --renameillegalidents true
*/
public abstract class BCertsTable
extends BCommandBoundTable
implements CommandBindings.Support {
public static final Type TYPE;
public static final int COL_ALIAS = 0;
public static final int COL_ISSUER = 1;
public static final int COL_SUBJECT = 2;
public static final int COL_NOT_BEFORE = 3;
public static final int COL_NOT_AFTER = 4;
public static final int COL_KEY_ALG = 5;
public static final int COL_KEY_SIZE = 6;
public static final int COL_SIG_ALG = 7;
public static final int COL_SIG_SIZE = 8;
public static final int COL_VALID = 9;
public static final int COL_SELF_SIGNED = 10;
protected static Log log;
public static final Lexicon lex;
public static final ExtFileFilter PEM_FILTER;
private static String certsDirectoryPath;
static final BImage securityHigh;
static final BImage securityMedium;
static final BImage securityLow;
static final BImage jobIcon;
static final BImage successIcon;
static final BImage failedIcon;
static final BImage unknownIcon;
protected IntHashMap certGenRequests;
protected CertGenMonitor certGenMonitor;
protected ICoreKeyStore mgr;
protected boolean readonly;
static /* synthetic */ Class class$com$tridium$platcrypto$ui$BCertsTable;
static /* synthetic */ Class class$java$security$cert$X509Certificate;
public Type getType() {
return TYPE;
}
public void load() throws Exception {
this.certModel().load();
}
private static final void initCertDirectory() {
File file = Sys.getBajaHome();
if (file.getPath().contains("wbapplet")) {
file = file.getParentFile().getParentFile();
}
file = new File(file, "certManagement");
file.mkdir();
certsDirectoryPath = file.toString().replace("\\", "/");
}
protected static String getCertsDirectoryPath() {
if (certsDirectoryPath == null) {
BCertsTable.initCertDirectory();
}
return certsDirectoryPath;
}
protected abstract void initCommands();
protected CertModel certModel() {
DynamicTableModel dynamicTableModel = (DynamicTableModel)this.getModel();
return (CertModel)dynamicTableModel.getRootModel();
}
public boolean isReadonly() {
return this.readonly;
}
public void setReadonly(boolean bl) {
this.readonly = bl;
this.setCommandEnabledStates();
}
public void setBoundCommandEnabled(Command command, boolean bl) {
if (this.readonly && (command instanceof ImportCommand || command instanceof DeleteCommand)) {
command.setEnabled(false);
} else {
command.setEnabled(bl);
}
}
protected synchronized void checkCertMonitorThread() {
if (this.certGenMonitor == null || !this.certGenMonitor.isAlive()) {
this.certGenMonitor = new CertGenMonitor();
this.certGenMonitor.start();
}
}
protected void notify(String string, BImage bImage, String string2, String string3) {
BLabel bLabel = new BLabel(jobIcon, string);
bLabel.setFont(Theme.widget().getBoldText());
BLabel bLabel2 = new BLabel(bImage, string2);
BLabel bLabel3 = new BLabel(string3);
bLabel3.setForeground(Theme.widget().getControlShadow());
BGridPane bGridPane = new BGridPane(1);
bGridPane.add(null, (BValue)bLabel);
bGridPane.add(null, (BValue)bLabel2);
bGridPane.add(null, (BValue)bLabel3);
BNotifyPane bNotifyPane = new BNotifyPane();
bNotifyPane.setCenter((BWidget)bGridPane);
bNotifyPane.open();
}
static /* synthetic */ Class class(String string, boolean bl) {
try {
Class<?> clazz = Class.forName(string);
if (!bl) {
clazz = clazz.getComponentType();
}
return clazz;
}
catch (ClassNotFoundException classNotFoundException) {
throw new NoClassDefFoundError(classNotFoundException.getMessage());
}
}
private final /* synthetic */ void this() {
this.certGenRequests = new IntHashMap();
this.certGenMonitor = null;
this.mgr = null;
this.readonly = false;
}
public BCertsTable() throws UnsupportedOperationException {
this.this();
throw new UnsupportedOperationException();
}
public BCertsTable(ICoreKeyStore iCoreKeyStore) throws Exception {
int[] nArray = new int[6];
nArray[1] = 2;
nArray[2] = 4;
nArray[3] = 5;
nArray[4] = 6;
nArray[5] = 9;
super((TableModel)new DynamicTableModel((TableModel)new CertModel(iCoreKeyStore), nArray));
this.this();
this.mgr = iCoreKeyStore;
this.initCommands();
BCertsTable.initCertDirectory();
}
static {
Class clazz = class$com$tridium$platcrypto$ui$BCertsTable;
if (clazz == null) {
clazz = class$com$tridium$platcrypto$ui$BCertsTable = BCertsTable.class("[Lcom.tridium.platcrypto.ui.BCertsTable;", false);
}
TYPE = Sys.loadType((Class)clazz);
log = Log.getLog((String)"crypto");
lex = Lexicon.make((String)"platCrypto");
PEM_FILTER = new ExtFileFilter("", "pem,crt,cer");
certsDirectoryPath = null;
securityHigh = BImage.make((String)lex.get("security.high.x16.icon", "module://icons/x16/security-high.png"));
securityMedium = BImage.make((String)lex.get("security.medium.x16.icon", "module://icons/x16/security-medium.png"));
securityLow = BImage.make((String)lex.get("security.low.x16.icon", "module://icons/x16/security-low.png"));
jobIcon = BImage.make((String)"module://icons/x16/doc.png");
successIcon = BImage.make((String)"module://icons/x16/job/success.png");
failedIcon = BImage.make((String)"module://icons/x16/job/failed.png");
unknownIcon = BImage.make((String)"module://icons/x16/job/unknown.png");
}
/*
* Illegal identifiers - consider using --renameillegalidents true
*/
protected static class CertModel
extends TableModel {
protected Array certs;
protected ICoreKeyStore mgr;
static /* synthetic */ Class class$com$tridium$crypto$core$cert$NX509CertificateEntry;
public BImage getRowIcon(int n) {
if (this.getTable() instanceof BTrustCertsTable) {
return securityHigh;
}
try {
if (!this.cert(n).getCertificate(0).isSelfSigned()) {
return securityHigh;
}
return securityMedium;
}
catch (Exception exception) {
exception.printStackTrace();
return securityLow;
}
}
public void load() throws Exception {
Enumeration enumeration = this.mgr.getCertificates();
Class clazz = class$com$tridium$crypto$core$cert$NX509CertificateEntry;
if (clazz == null) {
clazz = class$com$tridium$crypto$core$cert$NX509CertificateEntry = CertModel.class("[Lcom.tridium.crypto.core.cert.NX509CertificateEntry;", false);
}
this.certs = new Array(clazz);
while (enumeration.hasMoreElements()) {
this.certs.add(enumeration.nextElement());
}
this.updateTable(true);
}
public int getColumnCount() {
return 11;
}
public String getColumnName(int n) {
switch (n) {
case 0: {
return lex.getText("cert.field.alias");
}
case 1: {
return lex.getText("cert.field.issuedBy");
}
case 2: {
return lex.getText("cert.field.subject");
}
case 3: {
return lex.getText("cert.field.notBefore");
}
case 4: {
return lex.getText("cert.field.notAfter");
}
case 5: {
return lex.getText("cert.field.keyAlgorithm");
}
case 6: {
return lex.getText("cert.field.keySize");
}
case 7: {
return lex.getText("cert.field.signatureAlgorithm");
}
case 8: {
return lex.getText("cert.field.signatureSize");
}
case 10: {
return lex.getText("cert.field.selfSigned");
}
case 9: {
return lex.getText("cert.field.valid");
}
}
throw new IndexOutOfBoundsException();
}
public boolean isColumnSortable(int n) {
return true;
}
public synchronized void sortByColumn(int n, boolean bl) {
Object[] objectArray = this.getColumnValues(n);
Object[] objectArray2 = this.certs.trim();
SortUtil.sort((Object[])objectArray, (Object[])objectArray2, (boolean)bl);
this.certs.clear();
this.certs.addAll(objectArray2);
}
public int getRowCount() {
int n = 0;
if (this.certs != null) {
n = this.certs.size();
}
return n;
}
public NX509CertificateEntry cert(int n) {
return (NX509CertificateEntry)this.certs.get(n);
}
public Object getValueAt(int n, int n2) {
switch (n2) {
case 0: {
return this.cert(n).getAlias();
}
case 1: {
return this.cert(n).getCertificate(0).getIssuer();
}
case 2: {
return this.cert(n).getCertificate(0).getSubject();
}
case 3: {
return this.cert(n).getCertificate(0).getNotBefore();
}
case 4: {
return this.cert(n).getCertificate(0).getNotAfter();
}
case 5: {
return this.cert(n).getCertificate(0).getKeyAlgorithm();
}
case 6: {
return "" + this.cert(n).getCertificate(0).getKeySize();
}
case 7: {
return this.cert(n).getCertificate(0).getSignatureAlgorithm();
}
case 8: {
return "" + this.cert(n).getCertificate(0).getSignatureSize();
}
case 10: {
return this.cert(n).getCertificate(0).isSelfSigned() ? lex.getText("cert.field.valid.true") : lex.getText("cert.field.valid.false");
}
case 9: {
return this.cert(n).getCertificate(0).checkValidity() ? lex.getText("cert.field.valid.true") : lex.getText("cert.field.valid.false");
}
}
throw new IndexOutOfBoundsException();
}
static /* synthetic */ Class class(String string, boolean bl) {
try {
Class<?> clazz = Class.forName(string);
if (!bl) {
clazz = clazz.getComponentType();
}
return clazz;
}
catch (ClassNotFoundException classNotFoundException) {
throw new NoClassDefFoundError(classNotFoundException.getMessage());
}
}
public CertModel(ICoreKeyStore iCoreKeyStore) {
this.mgr = iCoreKeyStore;
}
}
/*
* Illegal identifiers - consider using --renameillegalidents true
*/
protected abstract class ImportCommand
extends Command {
/*
* WARNING - Removed try catching itself - possible behaviour change.
* WARNING - Removed back jump from a try to a catch block - possible behaviour change.
* Enabled aggressive block sorting
* Enabled unnecessary exception pruning
* Enabled aggressive exception aggregation
*/
public CommandArtifact doInvoke() {
try {
BFileChooser bFileChooser = BFileChooser.makeOpen((BWidget)this.getOwner());
bFileChooser.setTitle(lex.getText("cert.import.chooser.title"));
bFileChooser.addFilter((IFileFilter)new ExtFileFilter(lex.getText("cert.extension.info"), "pem,p12,crt,cer,cert"));
bFileChooser.setCurrentDirectory(BOrd.make((String)("file:/" + certsDirectoryPath)));
BOrd bOrd = bFileChooser.show();
if (bOrd == null) {
return null;
}
BIFile bIFile = (BIFile)bOrd.get();
if (bIFile == null) return null;
Class clazz = class$java$security$cert$X509Certificate;
if (clazz == null) {
clazz = class$java$security$cert$X509Certificate = BCertsTable.class("[Ljava.security.cert.X509Certificate;", false);
}
Array array = new Array(clazz);
PrivateKey privateKey = null;
InputStreamReader inputStreamReader = new InputStreamReader(bIFile.getInputStream());
FriendlyPemReader friendlyPemReader = new FriendlyPemReader((Reader)inputStreamReader);
PEMParser pEMParser = new PEMParser((Reader)friendlyPemReader);
try {
try {
Object object = pEMParser.readObject();
while (object != null) {
X509Certificate x509Certificate;
if (object instanceof X509Certificate) {
array.add(object);
} else if (object instanceof X509CertificateHolder) {
x509Certificate = new JcaX509CertificateConverter().getCertificate((X509CertificateHolder)object);
array.add((Object)x509Certificate);
} else if (object instanceof PrivateKey) {
if (privateKey != null) throw new IOException("can't import multiple private keys from one file");
privateKey = (PrivateKey)object;
} else if (object instanceof KeyPair) {
if (privateKey != null) throw new IOException("can't import multiple private keys from one file");
privateKey = ((KeyPair)object).getPrivate();
} else if (object instanceof PEMKeyPair) {
if (privateKey != null) throw new IOException("can't import multiple private keys from one file");
privateKey = new JcaPEMKeyConverter().setProvider((Provider)new BouncyCastleProvider()).getPrivateKey(((PEMKeyPair)object).getPrivateKeyInfo());
} else {
if (!(object instanceof PEMEncryptedKeyPair)) throw new IOException("unsupported object type: " + object.getClass().getName());
if (privateKey != null) throw new IOException("can't import multiple private keys from one file");
x509Certificate = new JcePEMDecryptorProviderBuilder().setProvider((Provider)new BouncyCastleProvider());
PEMDecryptorProvider pEMDecryptorProvider = x509Certificate.build(new PrivateKeyPasswordFinder(this.getOwner()).getPassword());
JcaPEMKeyConverter jcaPEMKeyConverter = new JcaPEMKeyConverter().setProvider((Provider)new BouncyCastleProvider());
privateKey = jcaPEMKeyConverter.getPrivateKey(((PEMEncryptedKeyPair)object).decryptKeyPair(pEMDecryptorProvider).getPrivateKeyInfo());
}
object = pEMParser.readObject();
}
}
catch (PasswordException passwordException) {
BDialog.error((BWidget)this.getOwner(), (Object)lex.get("cert.import.privatekey.badpassword"));
CommandArtifact commandArtifact = null;
Object var10_17 = null;
try {
pEMParser.close();
return commandArtifact;
}
catch (Exception exception) {}
return commandArtifact;
}
}
catch (Throwable throwable) {
Object var10_18 = null;
try {}
catch (Exception exception) {}
pEMParser.close();
throw throwable;
throw throwable;
}
{
Object var10_19 = null;
}
try {}
catch (Exception exception) {}
pEMParser.close();
String string = bIFile.getFileName();
string = string.substring(0, string.length() - bIFile.getExtension().length() - 1);
this.importCertData(array, privateKey, string);
BCertsTable.this.mgr.save();
BCertsTable.this.certModel().load();
return null;
}
catch (EncryptionException encryptionException) {
BDialog.error((BWidget)this.getOwner(), (Object)lex.get("cert.import.privatekey.badpassword"));
return null;
}
catch (Exception exception) {
CommandUtil.error((Command)this, (Throwable)exception);
}
return null;
}
protected abstract void importCertData(Array var1, PrivateKey var2, String var3) throws Exception;
public ImportCommand() {
super((BWidget)BCertsTable.this, lex, "cert.button.import");
}
}
/*
* Illegal identifiers - consider using --renameillegalidents true
*/
protected class DeleteCommand
extends Command {
public CommandArtifact doInvoke() {
try {
if (4 == BDialog.confirm((BWidget)BCertsTable.this, (String)lex.getText("cert.delete.dialog.title"), (Object)lex.getText("cert.delete.dialog.info"), (int)12)) {
int[] nArray = BCertsTable.this.getSelection().getRows();
String[] stringArray = new String[nArray.length];
int n = 0;
while (n < nArray.length) {
stringArray[n] = BCertsTable.this.certModel().cert(nArray[n]).getAlias();
log.trace("request to delete alias " + stringArray[n]);
++n;
}
BCertsTable.this.mgr.deleteEntries(stringArray);
BCertsTable.this.mgr.save();
BCertsTable.this.certModel().load();
}
}
catch (Exception exception) {
CommandUtil.error((Command)this, (Throwable)exception);
}
return null;
}
public DeleteCommand() {
super((BWidget)BCertsTable.this, lex, "cert.button.delete");
}
}
/*
* Illegal identifiers - consider using --renameillegalidents true
*/
protected class CertGenMonitor
extends Thread {
public void run() {
do {
IntHashMap.Iterator iterator = BCertsTable.this.certGenRequests.iterator();
while (iterator.hasNext()) {
try {
CertGenRequest certGenRequest = (CertGenRequest)iterator.next();
int n = BCertsTable.this.mgr.getCertGenerationStatus(certGenRequest.requestId);
if (n == -1) {
BCertsTable.this.certGenRequests.remove(certGenRequest.requestId);
log.message("cert generation failed for " + certGenRequest.getAlias());
BCertsTable.this.notify(lex.get("cert.generate.title"), failedIcon, lex.get("cert.generate.failed"), lex.getText("cert.generate.failed.msg", (Object[])new String[]{certGenRequest.getAlias()}));
continue;
}
if (n == 2) {
BCertsTable.this.certGenRequests.remove(certGenRequest.requestId);
log.message("cert generation succeeded for " + certGenRequest.getAlias());
BCertsTable.this.notify(lex.get("cert.generate.title"), successIcon, lex.get("cert.generate.success"), lex.getText("cert.generate.success.msg", (Object[])new String[]{certGenRequest.getAlias()}));
BCertsTable.this.certModel().load();
continue;
}
long l = PlatformUtil.ticks();
if (l - certGenRequest.submitted <= 3600000L) continue;
BCertsTable.this.certModel().load();
}
catch (NotConnectedException notConnectedException) {
break;
}
catch (Exception exception) {
exception.printStackTrace();
}
}
try {
Thread.sleep(2500L);
}
catch (Exception exception) {}
} while (!BCertsTable.this.certGenRequests.isEmpty());
}
public CertGenMonitor() {
super("tCertGenMonitor");
}
}
static class CertGenRequest {
private int requestId;
private String alias;
private long submitted;
public int getRequestId() {
return this.requestId;
}
public String getAlias() {
return this.alias;
}
public CertGenRequest(int n, String string) {
this.requestId = n;
this.alias = string;
this.submitted = PlatformUtil.ticks();
}
}
/*
* Illegal identifiers - consider using --renameillegalidents true
*/
protected class ViewCommand
extends Command {
public CommandArtifact doInvoke() {
try {
int n = BCertsTable.this.certModel().getSelection().getRow();
BCertEntryViewDialog.show((BWidget)BCertsTable.this, BCertsTable.this.certModel().cert(n));
}
catch (Exception exception) {
CommandUtil.error((Command)this, (Throwable)exception);
}
return null;
}
public ViewCommand() {
super((BWidget)BCertsTable.this, lex, "cert.button.view");
}
}
/*
* Illegal identifiers - consider using --renameillegalidents true
*/
protected class ExportCommand
extends Command {
/*
* Exception decompiling
*/
public CommandArtifact doInvoke() {
/*
* This method has failed to decompile. When submitting a bug report, please provide this stack trace, and (if you hold appropriate legal rights) the relevant class file.
*
* org.benf.cfr.reader.util.ConfusedCFRException: Back jump on a try block [egrp 9[TRYBLOCK] [11 : 615->618)] java.lang.Throwable
* at org.benf.cfr.reader.bytecode.analysis.opgraph.Op02WithProcessedDataAndRefs.insertExceptionBlocks(Op02WithProcessedDataAndRefs.java:2283)
* at org.benf.cfr.reader.bytecode.CodeAnalyser.getAnalysisInner(CodeAnalyser.java:415)
* at org.benf.cfr.reader.bytecode.CodeAnalyser.getAnalysisOrWrapFail(CodeAnalyser.java:278)
* at org.benf.cfr.reader.bytecode.CodeAnalyser.getAnalysis(CodeAnalyser.java:201)
* at org.benf.cfr.reader.entities.attributes.AttributeCode.analyse(AttributeCode.java:94)
* at org.benf.cfr.reader.entities.Method.analyse(Method.java:531)
* at org.benf.cfr.reader.entities.ClassFile.analyseMid(ClassFile.java:1055)
* at org.benf.cfr.reader.entities.ClassFile.analyseInnerClassesPass1(ClassFile.java:923)
* at org.benf.cfr.reader.entities.ClassFile.analyseMid(ClassFile.java:1035)
* at org.benf.cfr.reader.entities.ClassFile.analyseTop(ClassFile.java:942)
* at org.benf.cfr.reader.Driver.doJarVersionTypes(Driver.java:257)
* at org.benf.cfr.reader.Driver.doJar(Driver.java:139)
* at org.benf.cfr.reader.CfrDriverImpl.analyse(CfrDriverImpl.java:76)
* at org.benf.cfr.reader.Main.main(Main.java:54)
*/
throw new IllegalStateException("Decompilation failed");
}
public ExportCommand() {
super((BWidget)BCertsTable.this, lex, "cert.button.export");
}
}
}