class Cols{
int r, g, b;
Cols(int r, int g, int b){
this.r = r;
this.g = g;
this.b = b;
}
}
enum ColorType {
Red("赤", 240, 0, 0),
Green("緑", 0, 240, 0),
Blue("青", 0, 0, 240),
Yellow("黄色", 240, 240, 0),
Purple("紫", 240, 0, 240);
final String name;
int r, g, b;
ColorType(String name, int r, int g, int b) {
this.name = name;
this.r = r;
this.g = g;
this.b = b;
}
String get_name() {
return name;
}
}
abstract class Figure {
ColorType colorType;
color col;
PVector offset;
ArrayList<PVector> pos;
Figure(ColorType colorType, PVector offset) {
this.colorType = colorType;
this.col = color(colorType.r, colorType.g, colorType.b);
this.offset = offset;
this.pos = new ArrayList<PVector>();
}
abstract void drawSelf();
void drawHover(){
if (isIn()) {
stroke(0);
strokeWeight(2);
} else {
noStroke();
}
}
void draw() {
drawHover();
fill(col);
drawSelf();
}
abstract boolean isIn();
boolean isClicked() {
return isIn();
}
}
class Maru extends Figure {
int d;
int r;
Maru(ColorType colorType, PVector offset) {
super(colorType, offset);
pos.add(new PVector(250, 300));
pos.get(0).add(offset);
d = 150;
r = d/2;
}
void drawSelf() {
ellipse(pos.get(0).x, pos.get(0).y, d, d);
}
boolean isIn() {
float a = mouseX - pos.get(0).x;
float b = mouseY - pos.get(0).y;
return sqrt(a*a + b*b) < r;
}
}
class Sankaku extends Figure {
ArrayList<PVector> es;//edges
Sankaku(ColorType colorType, PVector offset) {
super(colorType, offset);
PVector center = new PVector(250, 325);
for(int i=0; i<3; i++){
float delta = TWO_PI * ((float)i)/3 + radians(30);
PVector r = new PVector(100, 0);
r.rotate(delta);
PVector pt = new PVector(center.x, center.y);
pt.add(r);
pos.add(pt);
}
center.add(offset);
for (PVector p : pos) {
p.add(offset);
}
es = new ArrayList<PVector>();
for (int i=0, j=1; i<pos.size(); i++, j++, j%=pos.size()) {
es.add(new PVector(
pos.get(j).x - pos.get(i).x,
pos.get(j).y - pos.get(i).y));
}
}
void drawSelf() {
beginShape();
for (PVector p : pos) {
vertex(p.x, p.y);
}
endShape(CLOSE);
}
boolean isIn() {
for (int i=0; i<es.size(); i++) {
PVector p = pos.get(i);
PVector m = new PVector(
mouseX - p.x,
mouseY - p.y);//mouse
PVector e = es.get(i);
if (m.x * e.y - m.y * e.x > 0) {
return false;
}
}
return true;
}
}
class Shikaku extends Figure {
int w;
int h;
PVector s;//start
Shikaku(ColorType colorType, PVector offset) {
super(colorType, offset);
w = 150;
h = 150;
s = new PVector(200, 225);
pos.add(new PVector(s.x, s.y));
pos.add(new PVector(s.x+w, s.y));
pos.add(new PVector(s.x+w, s.y+h));
pos.add(new PVector(s.x, s.y+h));
s.add(offset);
for(PVector p: pos){
p.add(offset);
}
}
void drawSelf() {
beginShape();
for (PVector p : pos) {
vertex(p.x, p.y);
}
endShape(CLOSE);
}
boolean isIn() {
return
s.x < mouseX && mouseX < s.x+w
&&
s.y < mouseY && mouseY < s.y+h;
}
}
class Question {
ColorType correctColor;
ColorType chooseColor;
Figure left;
Figure right;
Question(ColorType correctColor, Figure left, Figure right) {
this.correctColor = correctColor;
this.left = left;
this.right = right;
}
void draw() {
left.draw();
right.draw();
}
boolean isClicked() {
if (left.isClicked()) {
chooseColor = left.colorType;
return true;
} else if (right.isClicked()) {
chooseColor = right.colorType;
return true;
}
return false;
}
boolean isCorrect() {
return correctColor == chooseColor;
}
String correctColorName() {
return correctColor.get_name();
}
String chooseColorName() {
return chooseColor.get_name();
}
}
enum FigureType {
Maru,
Shikaku,
Sankaku,
}
class QuestionMaker {
ArrayList<FigureType> ftypes;
ArrayList<ColorType> cols;
ColorType ctypeL;
ColorType ctypeR;
ColorType correct;
Figure left;
Figure right;
QuestionMaker() {
ftypes = new ArrayList<FigureType>();
ftypes.add(FigureType.Maru);
ftypes.add(FigureType.Shikaku);
ftypes.add(FigureType.Sankaku);
cols = new ArrayList<ColorType>();
cols.add(ColorType.Red);
cols.add(ColorType.Green);
cols.add(ColorType.Blue);
cols.add(ColorType.Yellow);
cols.add(ColorType.Purple);
Collections.shuffle(cols);
ctypeL = cols.get(0);
ctypeR = cols.get(1);
ArrayList<ColorType> corr = new ArrayList<>();
corr.add(ctypeL);
corr.add(ctypeR);
Collections.shuffle(corr);
correct = corr.get(0);
PVector offsetL = new PVector(0, 0);
PVector offsetR = new PVector(250, 0);
left = getFigure(ctypeL, offsetL);
right = getFigure(ctypeR, offsetR);
}
Figure getFigure(ColorType ctype, PVector offset) {
Random rand = new Random();
int index = rand.nextInt(ftypes.size());
FigureType ftype = ftypes.get(index);
switch(ftype) {
case Maru:
return new Maru(ctype, offset);
case Sankaku:
return new Sankaku(ctype, offset);
case Shikaku:
return new Shikaku(ctype, offset);
default:
return new Maru(ctype, offset);
}
}
ColorType getCorrect() {
return correct;
}
Figure getLeft() {
return left;
}
Figure getRight() {
return right;
}
}
import java.util.Random;
import java.util.Collections;
enum State {
Title,
Show1,
Blank,
Show2,
Result,
}
State state;
PFont font;
int startTime;
int period;
String str_elp;
Question question;
void setup() {
size(800, 600);
noStroke();
state = State.Title;
QuestionMaker qm = new QuestionMaker();
question = new Question(qm.getCorrect(), qm.getLeft(), qm.getRight());
font = createFont("メイリオ", 40);
textFont(font);
}
void draw() {
background(255);
switch(state) {
case Title:
fill(0);
text("マウスを押したら実験開始", 100, 300);
text(question.correctColorName() + "の図形を選んでください", 150, 380);
break;
case Show1:
question.draw();
break;
case Blank:
if ((millis() - startTime) >= period) {
state = State.Show2;
startTime = millis();
}
break;
case Show2:
question.draw();
break;
case Result:
fill(0);
text("key: ", 30, 40 );
text("RT: ", 30, 80 );
text("Elapsed: " + str_elp, 30, 120);
break;
}
}
void mousePressed() {
switch(state) {
case Title:
state = State.Show1;
break;
case Show1:
state = State.Blank;
startTime = millis();
period = (new Random()).nextInt(200) + 1800;
break;
case Blank:
break;
case Show2:
if (question.isClicked()) {
state = State.Result;
str_elp = nf(millis() - startTime, 4);
}
break;
case Result:
{
state = State.Title;
QuestionMaker qm = new QuestionMaker();
question = new Question(qm.getCorrect(), qm.getLeft(), qm.getRight());
}
break;
}
}
Y2xhc3MgQ29sc3sKICBpbnQgciwgZywgYjsKICAKICBDb2xzKGludCByLCBpbnQgZywgaW50IGIpewogICAgdGhpcy5yID0gcjsKICAgIHRoaXMuZyA9IGc7CiAgICB0aGlzLmIgPSBiOwogIH0KfQplbnVtIENvbG9yVHlwZSB7CiAgUmVkKCLotaQiLCAyNDAsIDAsIDApLAogICAgR3JlZW4oIue3kSIsIDAsIDI0MCwgMCksCiAgICBCbHVlKCLpnZIiLCAwLCAwLCAyNDApLAogICAgWWVsbG93KCLpu4ToibIiLCAyNDAsIDI0MCwgMCksCiAgICBQdXJwbGUoIue0qyIsIDI0MCwgMCwgMjQwKTsKCiAgZmluYWwgU3RyaW5nIG5hbWU7CiAgaW50IHIsIGcsIGI7CgogIENvbG9yVHlwZShTdHJpbmcgbmFtZSwgaW50IHIsIGludCBnLCBpbnQgYikgewogICAgdGhpcy5uYW1lID0gbmFtZTsKICAgIHRoaXMuciA9IHI7CiAgICB0aGlzLmcgPSBnOwogICAgdGhpcy5iID0gYjsKICB9CiAgU3RyaW5nIGdldF9uYW1lKCkgewogICAgcmV0dXJuIG5hbWU7CiAgfQp9CmFic3RyYWN0IGNsYXNzIEZpZ3VyZSB7CiAgQ29sb3JUeXBlIGNvbG9yVHlwZTsKICBjb2xvciBjb2w7CiAgUFZlY3RvciBvZmZzZXQ7CiAgQXJyYXlMaXN0PFBWZWN0b3I+IHBvczsKCiAgRmlndXJlKENvbG9yVHlwZSBjb2xvclR5cGUsIFBWZWN0b3Igb2Zmc2V0KSB7CiAgICB0aGlzLmNvbG9yVHlwZSA9IGNvbG9yVHlwZTsKICAgIHRoaXMuY29sID0gY29sb3IoY29sb3JUeXBlLnIsIGNvbG9yVHlwZS5nLCBjb2xvclR5cGUuYik7CiAgICB0aGlzLm9mZnNldCA9IG9mZnNldDsKICAgIHRoaXMucG9zID0gbmV3IEFycmF5TGlzdDxQVmVjdG9yPigpOwogIH0KICBhYnN0cmFjdCB2b2lkIGRyYXdTZWxmKCk7CiAgdm9pZCBkcmF3SG92ZXIoKXsKICAgIGlmIChpc0luKCkpIHsKICAgICAgc3Ryb2tlKDApOwogICAgICBzdHJva2VXZWlnaHQoMik7CiAgICB9IGVsc2UgewogICAgICBub1N0cm9rZSgpOwogICAgfQogIH0KICB2b2lkIGRyYXcoKSB7CiAgICBkcmF3SG92ZXIoKTsKICAgIAogICAgZmlsbChjb2wpOwogICAgZHJhd1NlbGYoKTsKICB9CiAgYWJzdHJhY3QgYm9vbGVhbiBpc0luKCk7CiAgYm9vbGVhbiBpc0NsaWNrZWQoKSB7CiAgICByZXR1cm4gaXNJbigpOwogIH0KfQpjbGFzcyBNYXJ1IGV4dGVuZHMgRmlndXJlIHsKICBpbnQgZDsKICBpbnQgcjsKCiAgTWFydShDb2xvclR5cGUgY29sb3JUeXBlLCBQVmVjdG9yIG9mZnNldCkgewogICAgc3VwZXIoY29sb3JUeXBlLCBvZmZzZXQpOwogICAgCiAgICBwb3MuYWRkKG5ldyBQVmVjdG9yKDI1MCwgMzAwKSk7CiAgICBwb3MuZ2V0KDApLmFkZChvZmZzZXQpOwogICAgCiAgICBkID0gMTUwOwogICAgciA9IGQvMjsKICB9CiAgdm9pZCBkcmF3U2VsZigpIHsKICAgIGVsbGlwc2UocG9zLmdldCgwKS54LCBwb3MuZ2V0KDApLnksIGQsIGQpOwogIH0KICBib29sZWFuIGlzSW4oKSB7CiAgICBmbG9hdCBhID0gbW91c2VYIC0gcG9zLmdldCgwKS54OwogICAgZmxvYXQgYiA9IG1vdXNlWSAtIHBvcy5nZXQoMCkueTsKICAgIHJldHVybiBzcXJ0KGEqYSArIGIqYikgPCByOwogIH0KfQpjbGFzcyBTYW5rYWt1IGV4dGVuZHMgRmlndXJlIHsKICBBcnJheUxpc3Q8UFZlY3Rvcj4gZXM7Ly9lZGdlcwoKICBTYW5rYWt1KENvbG9yVHlwZSBjb2xvclR5cGUsIFBWZWN0b3Igb2Zmc2V0KSB7CiAgICBzdXBlcihjb2xvclR5cGUsIG9mZnNldCk7CiAgICAKICAgIFBWZWN0b3IgY2VudGVyID0gbmV3IFBWZWN0b3IoMjUwLCAzMjUpOwogICAgCiAgICBmb3IoaW50IGk9MDsgaTwzOyBpKyspewogICAgICBmbG9hdCBkZWx0YSA9IFRXT19QSSAqICgoZmxvYXQpaSkvMyArIHJhZGlhbnMoMzApOwogICAgICBQVmVjdG9yIHIgPSBuZXcgUFZlY3RvcigxMDAsIDApOwogICAgICByLnJvdGF0ZShkZWx0YSk7CiAgICAgIAogICAgICBQVmVjdG9yIHB0ID0gbmV3IFBWZWN0b3IoY2VudGVyLngsIGNlbnRlci55KTsKICAgICAgcHQuYWRkKHIpOwogICAgICAKICAgICAgcG9zLmFkZChwdCk7CiAgICB9CiAgICAKICAgIGNlbnRlci5hZGQob2Zmc2V0KTsKICAgIGZvciAoUFZlY3RvciBwIDogcG9zKSB7CiAgICAgIHAuYWRkKG9mZnNldCk7CiAgICB9CgogICAgZXMgPSBuZXcgQXJyYXlMaXN0PFBWZWN0b3I+KCk7CiAgICBmb3IgKGludCBpPTAsIGo9MTsgaTxwb3Muc2l6ZSgpOyBpKyssIGorKywgaiU9cG9zLnNpemUoKSkgewogICAgICBlcy5hZGQobmV3IFBWZWN0b3IoCiAgICAgICAgcG9zLmdldChqKS54IC0gcG9zLmdldChpKS54LAogICAgICAgIHBvcy5nZXQoaikueSAtIHBvcy5nZXQoaSkueSkpOwogICAgfQogIH0KICB2b2lkIGRyYXdTZWxmKCkgewogICAgYmVnaW5TaGFwZSgpOwogICAgZm9yIChQVmVjdG9yIHAgOiBwb3MpIHsKICAgICAgdmVydGV4KHAueCwgcC55KTsKICAgIH0KICAgIGVuZFNoYXBlKENMT1NFKTsKICB9CiAgYm9vbGVhbiBpc0luKCkgewogICAgZm9yIChpbnQgaT0wOyBpPGVzLnNpemUoKTsgaSsrKSB7CiAgICAgIFBWZWN0b3IgcCA9IHBvcy5nZXQoaSk7CiAgICAgIFBWZWN0b3IgbSA9IG5ldyBQVmVjdG9yKAogICAgICAgIG1vdXNlWCAtIHAueCwKICAgICAgICBtb3VzZVkgLSBwLnkpOy8vbW91c2UKCiAgICAgIFBWZWN0b3IgZSA9IGVzLmdldChpKTsKICAgICAgaWYgKG0ueCAqIGUueSAtIG0ueSAqIGUueCA+IDApIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KfQpjbGFzcyBTaGlrYWt1IGV4dGVuZHMgRmlndXJlIHsKICBpbnQgdzsKICBpbnQgaDsKICBQVmVjdG9yIHM7Ly9zdGFydAoKICBTaGlrYWt1KENvbG9yVHlwZSBjb2xvclR5cGUsIFBWZWN0b3Igb2Zmc2V0KSB7CiAgICBzdXBlcihjb2xvclR5cGUsIG9mZnNldCk7CiAgICB3ID0gMTUwOwogICAgaCA9IDE1MDsKCiAgICBzID0gbmV3IFBWZWN0b3IoMjAwLCAyMjUpOwogICAgcG9zLmFkZChuZXcgUFZlY3RvcihzLngsIHMueSkpOwogICAgcG9zLmFkZChuZXcgUFZlY3RvcihzLngrdywgcy55KSk7CiAgICBwb3MuYWRkKG5ldyBQVmVjdG9yKHMueCt3LCBzLnkraCkpOwogICAgcG9zLmFkZChuZXcgUFZlY3RvcihzLngsIHMueStoKSk7CiAgICAKICAgIHMuYWRkKG9mZnNldCk7CiAgICBmb3IoUFZlY3RvciBwOiBwb3MpewogICAgICBwLmFkZChvZmZzZXQpOwogICAgfQogIH0KICB2b2lkIGRyYXdTZWxmKCkgewogICAgYmVnaW5TaGFwZSgpOwogICAgZm9yIChQVmVjdG9yIHAgOiBwb3MpIHsKICAgICAgdmVydGV4KHAueCwgcC55KTsKICAgIH0KICAgIGVuZFNoYXBlKENMT1NFKTsKICB9CiAgYm9vbGVhbiBpc0luKCkgewogICAgcmV0dXJuCiAgICAgIHMueCA8IG1vdXNlWCAmJiBtb3VzZVggPCBzLngrdwogICAgICAmJgogICAgICBzLnkgPCBtb3VzZVkgJiYgbW91c2VZIDwgcy55K2g7CiAgfQp9CmNsYXNzIFF1ZXN0aW9uIHsKICBDb2xvclR5cGUgY29ycmVjdENvbG9yOwogIENvbG9yVHlwZSBjaG9vc2VDb2xvcjsKCiAgRmlndXJlIGxlZnQ7CiAgRmlndXJlIHJpZ2h0OwoKICBRdWVzdGlvbihDb2xvclR5cGUgY29ycmVjdENvbG9yLCBGaWd1cmUgbGVmdCwgRmlndXJlIHJpZ2h0KSB7CiAgICB0aGlzLmNvcnJlY3RDb2xvciA9IGNvcnJlY3RDb2xvcjsKICAgIHRoaXMubGVmdCA9IGxlZnQ7CiAgICB0aGlzLnJpZ2h0ID0gcmlnaHQ7CiAgfQogIHZvaWQgZHJhdygpIHsKICAgIGxlZnQuZHJhdygpOwogICAgcmlnaHQuZHJhdygpOwogIH0KICBib29sZWFuIGlzQ2xpY2tlZCgpIHsKICAgIGlmIChsZWZ0LmlzQ2xpY2tlZCgpKSB7CiAgICAgIGNob29zZUNvbG9yID0gbGVmdC5jb2xvclR5cGU7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIGlmIChyaWdodC5pc0NsaWNrZWQoKSkgewogICAgICBjaG9vc2VDb2xvciA9IHJpZ2h0LmNvbG9yVHlwZTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGJvb2xlYW4gaXNDb3JyZWN0KCkgewogICAgcmV0dXJuIGNvcnJlY3RDb2xvciA9PSBjaG9vc2VDb2xvcjsKICB9CiAgU3RyaW5nIGNvcnJlY3RDb2xvck5hbWUoKSB7CiAgICByZXR1cm4gY29ycmVjdENvbG9yLmdldF9uYW1lKCk7CiAgfQogIFN0cmluZyBjaG9vc2VDb2xvck5hbWUoKSB7CiAgICByZXR1cm4gY2hvb3NlQ29sb3IuZ2V0X25hbWUoKTsKICB9Cn0KZW51bSBGaWd1cmVUeXBlIHsKICBNYXJ1LAogICAgU2hpa2FrdSwKICAgIFNhbmtha3UsCn0KCmNsYXNzIFF1ZXN0aW9uTWFrZXIgewogIEFycmF5TGlzdDxGaWd1cmVUeXBlPiBmdHlwZXM7CiAgQXJyYXlMaXN0PENvbG9yVHlwZT4gY29sczsKCiAgQ29sb3JUeXBlIGN0eXBlTDsKICBDb2xvclR5cGUgY3R5cGVSOwogIENvbG9yVHlwZSBjb3JyZWN0OwoKICBGaWd1cmUgbGVmdDsKICBGaWd1cmUgcmlnaHQ7CgogIFF1ZXN0aW9uTWFrZXIoKSB7CiAgICBmdHlwZXMgPSBuZXcgQXJyYXlMaXN0PEZpZ3VyZVR5cGU+KCk7CiAgICBmdHlwZXMuYWRkKEZpZ3VyZVR5cGUuTWFydSk7CiAgICBmdHlwZXMuYWRkKEZpZ3VyZVR5cGUuU2hpa2FrdSk7CiAgICBmdHlwZXMuYWRkKEZpZ3VyZVR5cGUuU2Fua2FrdSk7CgogICAgY29scyA9IG5ldyBBcnJheUxpc3Q8Q29sb3JUeXBlPigpOwogICAgY29scy5hZGQoQ29sb3JUeXBlLlJlZCk7CiAgICBjb2xzLmFkZChDb2xvclR5cGUuR3JlZW4pOwogICAgY29scy5hZGQoQ29sb3JUeXBlLkJsdWUpOwogICAgY29scy5hZGQoQ29sb3JUeXBlLlllbGxvdyk7CiAgICBjb2xzLmFkZChDb2xvclR5cGUuUHVycGxlKTsKICAgIENvbGxlY3Rpb25zLnNodWZmbGUoY29scyk7CgogICAgY3R5cGVMID0gY29scy5nZXQoMCk7CiAgICBjdHlwZVIgPSBjb2xzLmdldCgxKTsKCiAgICBBcnJheUxpc3Q8Q29sb3JUeXBlPiBjb3JyID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICBjb3JyLmFkZChjdHlwZUwpOwogICAgY29yci5hZGQoY3R5cGVSKTsKICAgIENvbGxlY3Rpb25zLnNodWZmbGUoY29ycik7CgogICAgY29ycmVjdCA9IGNvcnIuZ2V0KDApOwogICAgUFZlY3RvciBvZmZzZXRMID0gbmV3IFBWZWN0b3IoMCwgMCk7CiAgICBQVmVjdG9yIG9mZnNldFIgPSBuZXcgUFZlY3RvcigyNTAsIDApOwogICAgbGVmdCA9IGdldEZpZ3VyZShjdHlwZUwsIG9mZnNldEwpOwogICAgcmlnaHQgPSBnZXRGaWd1cmUoY3R5cGVSLCBvZmZzZXRSKTsKICB9CiAgRmlndXJlIGdldEZpZ3VyZShDb2xvclR5cGUgY3R5cGUsIFBWZWN0b3Igb2Zmc2V0KSB7CiAgICBSYW5kb20gcmFuZCA9IG5ldyBSYW5kb20oKTsKICAgIGludCBpbmRleCA9IHJhbmQubmV4dEludChmdHlwZXMuc2l6ZSgpKTsKICAgIEZpZ3VyZVR5cGUgZnR5cGUgPSBmdHlwZXMuZ2V0KGluZGV4KTsKCiAgICBzd2l0Y2goZnR5cGUpIHsKICAgIGNhc2UgTWFydToKICAgICAgcmV0dXJuIG5ldyBNYXJ1KGN0eXBlLCBvZmZzZXQpOwoKICAgIGNhc2UgU2Fua2FrdToKICAgICAgcmV0dXJuIG5ldyBTYW5rYWt1KGN0eXBlLCBvZmZzZXQpOwoKICAgIGNhc2UgU2hpa2FrdToKICAgICAgcmV0dXJuIG5ldyBTaGlrYWt1KGN0eXBlLCBvZmZzZXQpOwoKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiBuZXcgTWFydShjdHlwZSwgb2Zmc2V0KTsKICAgIH0KICB9CiAgQ29sb3JUeXBlIGdldENvcnJlY3QoKSB7CiAgICByZXR1cm4gY29ycmVjdDsKICB9CiAgRmlndXJlIGdldExlZnQoKSB7CiAgICByZXR1cm4gbGVmdDsKICB9CiAgRmlndXJlIGdldFJpZ2h0KCkgewogICAgcmV0dXJuIHJpZ2h0OwogIH0KfQppbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKCmVudW0gU3RhdGUgewogIFRpdGxlLAogICAgU2hvdzEsCiAgICBCbGFuaywKICAgIFNob3cyLAogICAgUmVzdWx0LAp9CgpTdGF0ZSBzdGF0ZTsKClBGb250IGZvbnQ7CgppbnQgc3RhcnRUaW1lOwppbnQgcGVyaW9kOwpTdHJpbmcgc3RyX2VscDsKClF1ZXN0aW9uIHF1ZXN0aW9uOwoKCnZvaWQgc2V0dXAoKSB7CiAgc2l6ZSg4MDAsIDYwMCk7CgogIG5vU3Ryb2tlKCk7CgogIHN0YXRlID0gU3RhdGUuVGl0bGU7CgogIFF1ZXN0aW9uTWFrZXIgcW0gPSBuZXcgUXVlc3Rpb25NYWtlcigpOwogIHF1ZXN0aW9uID0gbmV3IFF1ZXN0aW9uKHFtLmdldENvcnJlY3QoKSwgcW0uZ2V0TGVmdCgpLCBxbS5nZXRSaWdodCgpKTsKCiAgZm9udCA9IGNyZWF0ZUZvbnQoIuODoeOCpOODquOCqiIsIDQwKTsKICB0ZXh0Rm9udChmb250KTsKfQoKdm9pZCBkcmF3KCkgewogIGJhY2tncm91bmQoMjU1KTsKCiAgc3dpdGNoKHN0YXRlKSB7CiAgY2FzZSBUaXRsZToKICAgIGZpbGwoMCk7CiAgICB0ZXh0KCLjg57jgqbjgrnjgpLmirzjgZfjgZ/jgonlrp/pqJPplovlp4siLCAxMDAsIDMwMCk7CiAgICB0ZXh0KHF1ZXN0aW9uLmNvcnJlY3RDb2xvck5hbWUoKSArICLjga7lm7PlvaLjgpLpgbjjgpPjgafjgY/jgaDjgZXjgYQiLCAxNTAsIDM4MCk7CiAgICBicmVhazsKCiAgY2FzZSBTaG93MToKICAgIHF1ZXN0aW9uLmRyYXcoKTsKICAgIGJyZWFrOwoKICBjYXNlIEJsYW5rOgogICAgaWYgKChtaWxsaXMoKSAtIHN0YXJ0VGltZSkgPj0gcGVyaW9kKSB7CiAgICAgIHN0YXRlID0gU3RhdGUuU2hvdzI7CiAgICAgIHN0YXJ0VGltZSA9IG1pbGxpcygpOwogICAgfQogICAgYnJlYWs7CgogIGNhc2UgU2hvdzI6CiAgICBxdWVzdGlvbi5kcmF3KCk7CiAgICBicmVhazsKCiAgY2FzZSBSZXN1bHQ6CiAgICBmaWxsKDApOwogICAgdGV4dCgia2V5OiAiLCAzMCwgNDAgKTsKICAgIHRleHQoIlJUOiAiLCAzMCwgODAgKTsKICAgIHRleHQoIkVsYXBzZWQ6ICIgKyBzdHJfZWxwLCAzMCwgMTIwKTsKICAgIGJyZWFrOwogIH0KfQp2b2lkIG1vdXNlUHJlc3NlZCgpIHsKICBzd2l0Y2goc3RhdGUpIHsKICBjYXNlIFRpdGxlOgogICAgc3RhdGUgPSBTdGF0ZS5TaG93MTsKICAgIGJyZWFrOwoKICBjYXNlIFNob3cxOgogICAgc3RhdGUgPSBTdGF0ZS5CbGFuazsKICAgIHN0YXJ0VGltZSA9IG1pbGxpcygpOwogICAgcGVyaW9kID0gKG5ldyBSYW5kb20oKSkubmV4dEludCgyMDApICsgMTgwMDsKICAgIGJyZWFrOwoKICBjYXNlIEJsYW5rOgogICAgYnJlYWs7CgogIGNhc2UgU2hvdzI6CiAgICBpZiAocXVlc3Rpb24uaXNDbGlja2VkKCkpIHsKICAgICAgc3RhdGUgPSBTdGF0ZS5SZXN1bHQ7CiAgICAgIHN0cl9lbHAgPSBuZihtaWxsaXMoKSAtIHN0YXJ0VGltZSwgNCk7CiAgICB9CiAgICBicmVhazsKCiAgY2FzZSBSZXN1bHQ6CiAgICB7CiAgICAgIHN0YXRlID0gU3RhdGUuVGl0bGU7CiAgICAgIFF1ZXN0aW9uTWFrZXIgcW0gPSBuZXcgUXVlc3Rpb25NYWtlcigpOwogICAgICBxdWVzdGlvbiA9IG5ldyBRdWVzdGlvbihxbS5nZXRDb3JyZWN0KCksIHFtLmdldExlZnQoKSwgcW0uZ2V0UmlnaHQoKSk7CiAgICB9CiAgICBicmVhazsKICB9Cn0K