1d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/* 2d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Licensed to the Apache Software Foundation (ASF) under one or more 3d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * contributor license agreements. See the NOTICE file distributed with 4d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * this work for additional information regarding copyright ownership. 5d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * The ASF licenses this file to You under the Apache License, Version 2.0 6d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * (the "License"); you may not use this file except in compliance with 7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * the License. You may obtain a copy of the License at 8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * http://www.apache.org/licenses/LICENSE-2.0 10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Unless required by applicable law or agreed to in writing, software 12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * distributed under the License is distributed on an "AS IS" BASIS, 13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * See the License for the specific language governing permissions and 15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * limitations under the License. 16d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpackage org.apache.harmony.javax.security.auth.callback; 19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.io.Serializable; 21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic class ConfirmationCallback implements Callback, Serializable { 25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private static final long serialVersionUID = -9095656433782481624L; 27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public static final int YES = 0; // default options 29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public static final int NO = 1; 31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public static final int CANCEL = 2; 33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public static final int OK = 3; 35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public static final int YES_NO_OPTION = 0; // options type 37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public static final int YES_NO_CANCEL_OPTION = 1; 39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public static final int OK_CANCEL_OPTION = 2; 41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public static final int UNSPECIFIED_OPTION = -1; 43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public static final int INFORMATION = 0; // messages type 45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public static final int WARNING = 1; 47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public static final int ERROR = 2; 49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private String prompt; 51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private int messageType; 53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private int optionType = UNSPECIFIED_OPTION; 55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private int defaultOption; 57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private String[] options; 59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private int selection; 61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public ConfirmationCallback(int messageType, int optionType, int defaultOption) { 63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen super(); 64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (messageType > ERROR || messageType < INFORMATION) { 65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new IllegalArgumentException("auth.16"); //$NON-NLS-1$ 66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen switch (optionType) { 69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen case YES_NO_OPTION: 70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (defaultOption != YES && defaultOption != NO) { 71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new IllegalArgumentException("auth.17"); //$NON-NLS-1$ 72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen break; 74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen case YES_NO_CANCEL_OPTION: 75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (defaultOption != YES && defaultOption != NO && defaultOption != CANCEL) { 76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new IllegalArgumentException("auth.17"); //$NON-NLS-1$ 77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen break; 79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen case OK_CANCEL_OPTION: 80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (defaultOption != OK && defaultOption != CANCEL) { 81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new IllegalArgumentException("auth.17"); //$NON-NLS-1$ 82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen break; 84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen default: 85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new IllegalArgumentException("auth.18"); //$NON-NLS-1$ 86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.messageType = messageType; 88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.optionType = optionType; 89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.defaultOption = defaultOption; 90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 91d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public ConfirmationCallback(int messageType, String[] options, int defaultOption) { 93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen super(); 94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (messageType > ERROR || messageType < INFORMATION) { 95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new IllegalArgumentException("auth.16"); //$NON-NLS-1$ 96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (options == null || options.length == 0) { 99d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new IllegalArgumentException("auth.1A"); //$NON-NLS-1$ 100d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 101d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen for (int i = 0; i < options.length; i++) { 102d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (options[i] == null || options[i].length() == 0) { 103d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new IllegalArgumentException("auth.1A"); //$NON-NLS-1$ 104d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 105d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 106d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (0 > defaultOption || defaultOption >= options.length) { 107d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new IllegalArgumentException("auth.17"); //$NON-NLS-1$ 108d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 109d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // FIXME:System.arraycopy(options, 0 , new String[this.options.length], 110d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // 0, this.options.length); 111d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.options = options; 112d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.defaultOption = defaultOption; 113d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.messageType = messageType; 114d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 115d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 116d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public ConfirmationCallback(String prompt, int messageType, int optionType, 117d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen int defaultOption) { 118d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen super(); 119d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (prompt == null || prompt.length() == 0) { 120d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new IllegalArgumentException("auth.14"); //$NON-NLS-1$ 121d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 122d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 123d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (messageType > ERROR || messageType < INFORMATION) { 124d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new IllegalArgumentException("auth.16"); //$NON-NLS-1$ 125d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 126d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 127d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen switch (optionType) { 128d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen case YES_NO_OPTION: 129d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (defaultOption != YES && defaultOption != NO) { 130d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new IllegalArgumentException("auth.17"); //$NON-NLS-1$ 131d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 132d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen break; 133d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen case YES_NO_CANCEL_OPTION: 134d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (defaultOption != YES && defaultOption != NO && defaultOption != CANCEL) { 135d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new IllegalArgumentException("auth.17"); //$NON-NLS-1$ 136d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 137d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen break; 138d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen case OK_CANCEL_OPTION: 139d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (defaultOption != OK && defaultOption != CANCEL) { 140d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new IllegalArgumentException("auth.17"); //$NON-NLS-1$ 141d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 142d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen break; 143d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen default: 144d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new IllegalArgumentException("auth.18"); //$NON-NLS-1$ 145d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 146d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.prompt = prompt; 147d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.messageType = messageType; 148d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.optionType = optionType; 149d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.defaultOption = defaultOption; 150d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 151d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 152d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public ConfirmationCallback(String prompt, int messageType, String[] options, 153d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen int defaultOption) { 154d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen super(); 155d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (prompt == null || prompt.length() == 0) { 156d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new IllegalArgumentException("auth.14"); //$NON-NLS-1$ 157d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 158d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 159d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (messageType > ERROR || messageType < INFORMATION) { 160d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new IllegalArgumentException("auth.16"); //$NON-NLS-1$ 161d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 162d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 163d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (options == null || options.length == 0) { 164d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new IllegalArgumentException("auth.1A"); //$NON-NLS-1$ 165d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 166d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen for (int i = 0; i < options.length; i++) { 167d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (options[i] == null || options[i].length() == 0) { 168d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new IllegalArgumentException("auth.1A"); //$NON-NLS-1$ 169d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 170d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 171d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (0 > defaultOption || defaultOption >= options.length) { 172d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new IllegalArgumentException("auth.17"); //$NON-NLS-1$ 173d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 174d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // FIXME:System.arraycopy(options, 0 , new String[this.options.length], 175d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // 0, this.options.length); 176d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.options = options; 177d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.defaultOption = defaultOption; 178d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.messageType = messageType; 179d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.prompt = prompt; 180d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 181d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 182d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public String getPrompt() { 183d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return prompt; 184d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 185d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 186d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public int getMessageType() { 187d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return messageType; 188d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 189d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 190d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public int getDefaultOption() { 191d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return defaultOption; 192d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 193d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 194d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public String[] getOptions() { 195d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return options; 196d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 197d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 198d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public int getOptionType() { 199d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return optionType; 200d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 201d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 202d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public int getSelectedIndex() { 203d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return selection; 204d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 205d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 206d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public void setSelectedIndex(int selection) { 207d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (options != null) { 208d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (0 <= selection && selection <= options.length) { 209d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.selection = selection; 210d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } else { 211d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new ArrayIndexOutOfBoundsException("auth.1B"); //$NON-NLS-1$ 212d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 213d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } else { 214d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen switch (optionType) { 215d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen case YES_NO_OPTION: 216d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (selection != YES && selection != NO) { 217d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new IllegalArgumentException("auth.19"); //$NON-NLS-1$ 218d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 219d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen break; 220d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen case YES_NO_CANCEL_OPTION: 221d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (selection != YES && selection != NO && selection != CANCEL) { 222d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new IllegalArgumentException("auth.19"); //$NON-NLS-1$ 223d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 224d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen break; 225d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen case OK_CANCEL_OPTION: 226d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (selection != OK && selection != CANCEL) { 227d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new IllegalArgumentException("auth.19"); //$NON-NLS-1$ 228d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 229d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen break; 230d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 231d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.selection = selection; 232d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 233d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 234d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 235