/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
{
//------------------ Test Data ------------------
List
<Exon
> listExon
= new ArrayList
<>(List.
of( new Exon
(1L,
new IncomeCode
("45"), LocalDate.
of(2021,
1,
1),
"4",
BigDecimal.
valueOf(10)),
new Exon
(2L,
new IncomeCode
("21"), LocalDate.
of(2022,
1,
1),
"5",
BigDecimal.
valueOf(15)),
new Exon
(3L,
new IncomeCode
("33"), LocalDate.
of(2023,
1,
1),
"2",
BigDecimal.
valueOf(20)),
new Exon
(4L,
new IncomeCode
("45"), LocalDate.
of(2021,
1,
1),
"4",
BigDecimal.
valueOf(25)) ));
List
<Sup
> listSup
= new ArrayList
<>(List.
of( new Sup
(1L,
new IncomeCode
("45"),
null, LocalDate.
of(2021,
1,
1),
"4",
BigDecimal.
valueOf(30)),
new Sup
(2L,
new IncomeCode
("21"),
null, LocalDate.
of(2022,
1,
1),
"5",
BigDecimal.
valueOf(40)),
new Sup
(3L,
new IncomeCode
("33"),
null, LocalDate.
of(2023,
1,
1),
"2",
BigDecimal.
valueOf(50)) ));
//------------------ Creating List of Mixed Objects Exon and Sup ------------------
List<List<Object>> listMixed = new ArrayList<>(Stream.concat(listExon.stream(), listSup.stream())
.collect(Collectors.groupingBy(obj -> {
if (obj.getClass() == Exon.class) {
Exon exon = (Exon) obj;
return String.
format("%s-%s-%s", exon.
getIncomeCode(), exon.
getEndDate(), exon.
getCodeRef()); }
Sup sup = (Sup) obj;
return String.
format("%s-%s-%s", sup.
getIncomeCode(), sup.
getEndDate(), sup.
getCodeRef()); })).values());
System.
out.
println("List of lists of Exon and Sup: "); for (List<Object> l : listMixed) {
}
//Creating List of GlobalData from Exon & Sup
List<GlobalData> listGlobalData2 = listMixed.stream()
.map(list -> {
Object firstObj
= list.
stream().
findFirst().
orElse(null); if (firstObj == null) {
return null;
}
GlobalData gd = null;
if (firstObj.getClass() == Exon.class) {
Exon exon = (Exon) firstObj;
gd = new GlobalData(exon.getIncomeCode(), exon.getEndDate(), exon.getCodeRef());
} else {
Sup sup = (Sup) firstObj;
gd = new GlobalData(sup.getIncomeCode(), sup.getEndDate(), sup.getCodeRef());
}
if (o.getClass() == Exon.class){
Exon exon = (Exon) o;
gd.setValue(gd.getValue().add(exon.getValue()));
if (exon.getXxx() > 100){
gd.setIncome(calcMethod(exon));
}
} else {
Sup sup = (Sup) o;
gd.setValue(gd.getValue().add(sup.getValue()));
if (sup.getXxx() > 100){
gd.setIncome(calcMethod(sup));
}
}
}
return gd;
})
.filter(obj -> obj != null)
.collect(Collectors.toList());
System.
out.
println("\nList of GlobalData: "); for (GlobalData gd : listGlobalData2) {
}
}
return exon.
getValue().
multiply(BigDecimal.
valueOf(1.1)); }
return sup.
getValue().
multiply(BigDecimal.
valueOf(1.3)); }
static class Exon {
private IncomeCode incomeCode;
private LocalDate endDate;
this.id = id;
this.incomeCode = incomeCode;
this.endDate = endDate;
this.codeRef = codeRef;
this.
xxx = ((int) (Math.
random() * 100 + 50)); this.value = value;
}
public IncomeCode getIncomeCode() {
return incomeCode;
}
public LocalDate getEndDate() {
return endDate;
}
return codeRef;
}
return xxx;
}
return value;
}
@Override
return String.
format("%s{%s %s %s - Value: %s xxx: %s}", getClass
().
getSimpleName(), incomeCode, endDate, codeRef, value, xxx
); }
}
static class Sup {
private IncomeCode incomeCode;
private LocalDate startDate;
private LocalDate endDate;
public Sup
(Long id, IncomeCode incomeCode, LocalDate startDate, LocalDate endDate,
String codeRef,
BigDecimal value
) { this.id = id;
this.incomeCode = incomeCode;
this.startDate = startDate;
this.endDate = endDate;
this.codeRef = codeRef;
this.
xxx = ((int) (Math.
random() * 50 + 50)); this.value = value;
}
public IncomeCode getIncomeCode() {
return incomeCode;
}
public LocalDate getEndDate() {
return endDate;
}
return codeRef;
}
return xxx;
}
return value;
}
@Override
return String.
format("%s{%s %s %s - Value: %s xxx: %s}", getClass
().
getSimpleName(), incomeCode, endDate, codeRef, value, xxx
); }
}
static class IncomeCode {
public IncomeCode
(String code
) { this.code = code;
}
@Override
return code;
}
}
static class GlobalData {
private UUID id = UUID.randomUUID();
private IncomeCode incomeCode;
private LocalDate endDate;
private boolean taxable;
//private BigDecimal taxableIncome = BigDecimal.ZERO;
public GlobalData
(IncomeCode incomeCode, LocalDate endDate,
String codeRef
) { this.incomeCode = incomeCode;
this.endDate = endDate;
this.codeRef = codeRef;
}
public IncomeCode getIncomeCode() {
return incomeCode;
}
public void setIncomeCode(IncomeCode incomeCode) {
this.incomeCode = incomeCode;
}
public LocalDate getEndDate() {
return endDate;
}
public void setEndDate(LocalDate endDate) {
this.endDate = endDate;
}
return codeRef;
}
public void setCodeRef
(String codeRef
) { this.codeRef = codeRef;
}
return value;
}
this.value = value;
}
return Income;
}
Income = income;
}
return refIncome;
}
this.refIncome = refIncome;
}
@Override
return String.
format("%s{%s %s %s - value: %s Income: %s}", getClass
().
getSimpleName(), incomeCode, endDate, codeRef, value, Income
); }
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CmltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKaW1wb3J0IGphdmEudGltZS5Mb2NhbERhdGU7CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwppbXBvcnQgamF2YS51dGlsLkxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuVVVJRDsKaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOwoKLyogTmFtZSBvZiB0aGUgY2xhc3MgaGFzIHRvIGJlICJNYWluIiBvbmx5IGlmIHRoZSBjbGFzcyBpcyBwdWJsaWMuICovCmNsYXNzIElkZW9uZQp7CglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KCXsKCQkvLy0tLS0tLS0tLS0tLS0tLS0tLSBUZXN0IERhdGEgLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgTGlzdDxFeG9uPiBsaXN0RXhvbiA9IG5ldyBBcnJheUxpc3Q8PihMaXN0Lm9mKAogICAgICAgICAgICAgICAgbmV3IEV4b24oMUwsIG5ldyBJbmNvbWVDb2RlKCI0NSIpLCBMb2NhbERhdGUub2YoMjAyMSwgMSwgMSksICI0IiwgQmlnRGVjaW1hbC52YWx1ZU9mKDEwKSksCiAgICAgICAgICAgICAgICBuZXcgRXhvbigyTCwgbmV3IEluY29tZUNvZGUoIjIxIiksIExvY2FsRGF0ZS5vZigyMDIyLCAxLCAxKSwgIjUiLCBCaWdEZWNpbWFsLnZhbHVlT2YoMTUpKSwKICAgICAgICAgICAgICAgIG5ldyBFeG9uKDNMLCBuZXcgSW5jb21lQ29kZSgiMzMiKSwgTG9jYWxEYXRlLm9mKDIwMjMsIDEsIDEpLCAiMiIsIEJpZ0RlY2ltYWwudmFsdWVPZigyMCkpLAogICAgICAgICAgICAgICAgbmV3IEV4b24oNEwsIG5ldyBJbmNvbWVDb2RlKCI0NSIpLCBMb2NhbERhdGUub2YoMjAyMSwgMSwgMSksICI0IiwgQmlnRGVjaW1hbC52YWx1ZU9mKDI1KSkKICAgICAgICApKTsKCiAgICAgICAgTGlzdDxTdXA+IGxpc3RTdXAgPSBuZXcgQXJyYXlMaXN0PD4oTGlzdC5vZigKICAgICAgICAgICAgICAgIG5ldyBTdXAoMUwsIG5ldyBJbmNvbWVDb2RlKCI0NSIpLCBudWxsLCBMb2NhbERhdGUub2YoMjAyMSwgMSwgMSksICI0IiwgQmlnRGVjaW1hbC52YWx1ZU9mKDMwKSksCiAgICAgICAgICAgICAgICBuZXcgU3VwKDJMLCBuZXcgSW5jb21lQ29kZSgiMjEiKSwgbnVsbCwgTG9jYWxEYXRlLm9mKDIwMjIsIDEsIDEpLCAiNSIsIEJpZ0RlY2ltYWwudmFsdWVPZig0MCkpLAogICAgICAgICAgICAgICAgbmV3IFN1cCgzTCwgbmV3IEluY29tZUNvZGUoIjMzIiksIG51bGwsIExvY2FsRGF0ZS5vZigyMDIzLCAxLCAxKSwgIjIiLCBCaWdEZWNpbWFsLnZhbHVlT2YoNTApKQogICAgICAgICkpOwoKCiAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0gQ3JlYXRpbmcgTGlzdCBvZiBNaXhlZCBPYmplY3RzIEV4b24gYW5kIFN1cCAtLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICBMaXN0PExpc3Q8T2JqZWN0Pj4gbGlzdE1peGVkID0gbmV3IEFycmF5TGlzdDw+KFN0cmVhbS5jb25jYXQobGlzdEV4b24uc3RyZWFtKCksIGxpc3RTdXAuc3RyZWFtKCkpCiAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLmdyb3VwaW5nQnkob2JqIC0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAob2JqLmdldENsYXNzKCkgPT0gRXhvbi5jbGFzcykgewogICAgICAgICAgICAgICAgICAgICAgICBFeG9uIGV4b24gPSAoRXhvbikgb2JqOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXMtJXMtJXMiLCBleG9uLmdldEluY29tZUNvZGUoKSwgZXhvbi5nZXRFbmREYXRlKCksIGV4b24uZ2V0Q29kZVJlZigpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgU3VwIHN1cCA9IChTdXApIG9iajsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXMtJXMtJXMiLCBzdXAuZ2V0SW5jb21lQ29kZSgpLCBzdXAuZ2V0RW5kRGF0ZSgpLCBzdXAuZ2V0Q29kZVJlZigpKTsKICAgICAgICAgICAgICAgIH0pKS52YWx1ZXMoKSk7CgogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTGlzdCBvZiBsaXN0cyBvZiBFeG9uIGFuZCBTdXA6ICIpOwogICAgICAgIGZvciAoTGlzdDxPYmplY3Q+IGwgOiBsaXN0TWl4ZWQpIHsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGwpOwogICAgICAgIH0KCiAgICAgICAgLy9DcmVhdGluZyBMaXN0IG9mIEdsb2JhbERhdGEgZnJvbSBFeG9uICYgU3VwCiAgICAgICAgTGlzdDxHbG9iYWxEYXRhPiBsaXN0R2xvYmFsRGF0YTIgPSBsaXN0TWl4ZWQuc3RyZWFtKCkKICAgICAgICAgICAgICAgIC5tYXAobGlzdCAtPiB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGZpcnN0T2JqID0gbGlzdC5zdHJlYW0oKS5maW5kRmlyc3QoKS5vckVsc2UobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0T2JqID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEdsb2JhbERhdGEgZ2QgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdE9iai5nZXRDbGFzcygpID09IEV4b24uY2xhc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgRXhvbiBleG9uID0gKEV4b24pIGZpcnN0T2JqOwogICAgICAgICAgICAgICAgICAgICAgICBnZCA9IG5ldyBHbG9iYWxEYXRhKGV4b24uZ2V0SW5jb21lQ29kZSgpLCBleG9uLmdldEVuZERhdGUoKSwgZXhvbi5nZXRDb2RlUmVmKCkpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1cCBzdXAgPSAoU3VwKSBmaXJzdE9iajsKICAgICAgICAgICAgICAgICAgICAgICAgZ2QgPSBuZXcgR2xvYmFsRGF0YShzdXAuZ2V0SW5jb21lQ29kZSgpLCBzdXAuZ2V0RW5kRGF0ZSgpLCBzdXAuZ2V0Q29kZVJlZigpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZm9yIChPYmplY3QgbzogbGlzdCl7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvLmdldENsYXNzKCkgPT0gRXhvbi5jbGFzcyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeG9uIGV4b24gPSAoRXhvbikgbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkLnNldFZhbHVlKGdkLmdldFZhbHVlKCkuYWRkKGV4b24uZ2V0VmFsdWUoKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4b24uZ2V0WHh4KCkgPiAxMDApewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkLnNldEluY29tZShjYWxjTWV0aG9kKGV4b24pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cCBzdXAgPSAoU3VwKSBvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2Quc2V0VmFsdWUoZ2QuZ2V0VmFsdWUoKS5hZGQoc3VwLmdldFZhbHVlKCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXAuZ2V0WHh4KCkgPiAxMDApewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkLnNldEluY29tZShjYWxjTWV0aG9kKHN1cCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBnZDsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAuZmlsdGVyKG9iaiAtPiBvYmogIT0gbnVsbCkKICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOwoKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuTGlzdCBvZiBHbG9iYWxEYXRhOiAiKTsKICAgICAgICBmb3IgKEdsb2JhbERhdGEgZ2QgOiBsaXN0R2xvYmFsRGF0YTIpIHsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGdkKTsKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgQmlnRGVjaW1hbCBjYWxjTWV0aG9kKEV4b24gZXhvbikgewogICAgICAgIHJldHVybiBleG9uLmdldFZhbHVlKCkubXVsdGlwbHkoQmlnRGVjaW1hbC52YWx1ZU9mKDEuMSkpOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIEJpZ0RlY2ltYWwgY2FsY01ldGhvZChTdXAgc3VwKSB7CiAgICAgICAgcmV0dXJuIHN1cC5nZXRWYWx1ZSgpLm11bHRpcGx5KEJpZ0RlY2ltYWwudmFsdWVPZigxLjMpKTsKICAgIH0KCiAgICBzdGF0aWMgY2xhc3MgRXhvbiB7CiAgICAgICAgcHJpdmF0ZSBMb25nIGlkOwogICAgICAgIHByaXZhdGUgSW5jb21lQ29kZSBpbmNvbWVDb2RlOwogICAgICAgIHByaXZhdGUgTG9jYWxEYXRlIGVuZERhdGU7CiAgICAgICAgU3RyaW5nIGNvZGVSZWY7CiAgICAgICAgcHJpdmF0ZSBJbnRlZ2VyIHh4eDsKICAgICAgICBwcml2YXRlIEJpZ0RlY2ltYWwgdmFsdWU7CgogICAgICAgIHB1YmxpYyBFeG9uKExvbmcgaWQsIEluY29tZUNvZGUgaW5jb21lQ29kZSwgTG9jYWxEYXRlIGVuZERhdGUsIFN0cmluZyBjb2RlUmVmLCBCaWdEZWNpbWFsIHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuaWQgPSBpZDsKICAgICAgICAgICAgdGhpcy5pbmNvbWVDb2RlID0gaW5jb21lQ29kZTsKICAgICAgICAgICAgdGhpcy5lbmREYXRlID0gZW5kRGF0ZTsKICAgICAgICAgICAgdGhpcy5jb2RlUmVmID0gY29kZVJlZjsKICAgICAgICAgICAgdGhpcy54eHggPSAoKGludCkgKE1hdGgucmFuZG9tKCkgKiAxMDAgKyA1MCkpOwogICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgSW5jb21lQ29kZSBnZXRJbmNvbWVDb2RlKCkgewogICAgICAgICAgICByZXR1cm4gaW5jb21lQ29kZTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBMb2NhbERhdGUgZ2V0RW5kRGF0ZSgpIHsKICAgICAgICAgICAgcmV0dXJuIGVuZERhdGU7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvZGVSZWYoKSB7CiAgICAgICAgICAgIHJldHVybiBjb2RlUmVmOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIEludGVnZXIgZ2V0WHh4KCkgewogICAgICAgICAgICByZXR1cm4geHh4OwogICAgICAgIH0KCiAgICAgICAgcHVibGljIEJpZ0RlY2ltYWwgZ2V0VmFsdWUoKSB7CiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9CgogICAgICAgIEBPdmVycmlkZQogICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlc3slcyAlcyAlcyAtIFZhbHVlOiAlcyB4eHg6ICVzfSIsIGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpLCBpbmNvbWVDb2RlLCBlbmREYXRlLCBjb2RlUmVmLCB2YWx1ZSwgeHh4KTsKICAgICAgICB9CiAgICB9CgogICAgc3RhdGljIGNsYXNzIFN1cCB7CiAgICAgICAgcHJpdmF0ZSBMb25nIGlkOwogICAgICAgIHByaXZhdGUgSW5jb21lQ29kZSBpbmNvbWVDb2RlOwogICAgICAgIHByaXZhdGUgTG9jYWxEYXRlIHN0YXJ0RGF0ZTsKICAgICAgICBwcml2YXRlIExvY2FsRGF0ZSBlbmREYXRlOwogICAgICAgIFN0cmluZyBjb2RlUmVmOwoKICAgICAgICBwcml2YXRlIEludGVnZXIgeHh4OwogICAgICAgIHByaXZhdGUgQmlnRGVjaW1hbCB2YWx1ZTsKCiAgICAgICAgcHVibGljIFN1cChMb25nIGlkLCBJbmNvbWVDb2RlIGluY29tZUNvZGUsIExvY2FsRGF0ZSBzdGFydERhdGUsIExvY2FsRGF0ZSBlbmREYXRlLCBTdHJpbmcgY29kZVJlZiwgQmlnRGVjaW1hbCB2YWx1ZSkgewogICAgICAgICAgICB0aGlzLmlkID0gaWQ7CiAgICAgICAgICAgIHRoaXMuaW5jb21lQ29kZSA9IGluY29tZUNvZGU7CiAgICAgICAgICAgIHRoaXMuc3RhcnREYXRlID0gc3RhcnREYXRlOwogICAgICAgICAgICB0aGlzLmVuZERhdGUgPSBlbmREYXRlOwogICAgICAgICAgICB0aGlzLmNvZGVSZWYgPSBjb2RlUmVmOwogICAgICAgICAgICB0aGlzLnh4eCA9ICgoaW50KSAoTWF0aC5yYW5kb20oKSAqIDUwICsgNTApKTsKICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIEluY29tZUNvZGUgZ2V0SW5jb21lQ29kZSgpIHsKICAgICAgICAgICAgcmV0dXJuIGluY29tZUNvZGU7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgTG9jYWxEYXRlIGdldEVuZERhdGUoKSB7CiAgICAgICAgICAgIHJldHVybiBlbmREYXRlOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb2RlUmVmKCkgewogICAgICAgICAgICByZXR1cm4gY29kZVJlZjsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBJbnRlZ2VyIGdldFh4eCgpIHsKICAgICAgICAgICAgcmV0dXJuIHh4eDsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBCaWdEZWNpbWFsIGdldFZhbHVlKCkgewogICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgfQoKICAgICAgICBAT3ZlcnJpZGUKICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXN7JXMgJXMgJXMgLSBWYWx1ZTogJXMgeHh4OiAlc30iLCBnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSwgaW5jb21lQ29kZSwgZW5kRGF0ZSwgY29kZVJlZiwgdmFsdWUsIHh4eCk7CiAgICAgICAgfQogICAgfQoKICAgIHN0YXRpYyBjbGFzcyBJbmNvbWVDb2RlIHsKICAgICAgICBwcml2YXRlIFN0cmluZyBjb2RlOwoKICAgICAgICBwdWJsaWMgSW5jb21lQ29kZShTdHJpbmcgY29kZSkgewogICAgICAgICAgICB0aGlzLmNvZGUgPSBjb2RlOwogICAgICAgIH0KCiAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgICAgcmV0dXJuIGNvZGU7CiAgICAgICAgfQogICAgfQoKICAgIHN0YXRpYyBjbGFzcyBHbG9iYWxEYXRhIHsKCiAgICAgICAgcHJpdmF0ZSBVVUlEIGlkID0gVVVJRC5yYW5kb21VVUlEKCk7CiAgICAgICAgcHJpdmF0ZSBJbmNvbWVDb2RlIGluY29tZUNvZGU7CiAgICAgICAgcHJpdmF0ZSBMb2NhbERhdGUgZW5kRGF0ZTsKICAgICAgICBwcml2YXRlIFN0cmluZyBjb2RlUmVmOwogICAgICAgIHByaXZhdGUgYm9vbGVhbiB0YXhhYmxlOwogICAgICAgIHByaXZhdGUgU3RyaW5nIHB3ID0gIiI7CiAgICAgICAgcHJpdmF0ZSBCaWdEZWNpbWFsIGFyZWEgPSBCaWdEZWNpbWFsLlpFUk87CiAgICAgICAgLy9wcml2YXRlIEJpZ0RlY2ltYWwgdGF4YWJsZUluY29tZSA9IEJpZ0RlY2ltYWwuWkVSTzsKICAgICAgICBwcml2YXRlIEJpZ0RlY2ltYWwgdmFsdWUgPSBCaWdEZWNpbWFsLlpFUk87CiAgICAgICAgcHJpdmF0ZSBCaWdEZWNpbWFsIGV4b25WYWx1ZVR5cGUgPSBCaWdEZWNpbWFsLlpFUk87CiAgICAgICAgcHJpdmF0ZSBCaWdEZWNpbWFsIEluY29tZSA9IEJpZ0RlY2ltYWwuWkVSTzsKICAgICAgICBwcml2YXRlIEJpZ0RlY2ltYWwgZXhlbXB0ZWRJbmNvbWUgPSBCaWdEZWNpbWFsLlpFUk87CiAgICAgICAgcHJpdmF0ZSBCaWdEZWNpbWFsIHJlZkluY29tZSA9IEJpZ0RlY2ltYWwuWkVSTzsKCiAgICAgICAgcHVibGljIEdsb2JhbERhdGEoSW5jb21lQ29kZSBpbmNvbWVDb2RlLCBMb2NhbERhdGUgZW5kRGF0ZSwgU3RyaW5nIGNvZGVSZWYpIHsKICAgICAgICAgICAgdGhpcy5pbmNvbWVDb2RlID0gaW5jb21lQ29kZTsKICAgICAgICAgICAgdGhpcy5lbmREYXRlID0gZW5kRGF0ZTsKICAgICAgICAgICAgdGhpcy5jb2RlUmVmID0gY29kZVJlZjsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBJbmNvbWVDb2RlIGdldEluY29tZUNvZGUoKSB7CiAgICAgICAgICAgIHJldHVybiBpbmNvbWVDb2RlOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIHZvaWQgc2V0SW5jb21lQ29kZShJbmNvbWVDb2RlIGluY29tZUNvZGUpIHsKICAgICAgICAgICAgdGhpcy5pbmNvbWVDb2RlID0gaW5jb21lQ29kZTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBMb2NhbERhdGUgZ2V0RW5kRGF0ZSgpIHsKICAgICAgICAgICAgcmV0dXJuIGVuZERhdGU7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgdm9pZCBzZXRFbmREYXRlKExvY2FsRGF0ZSBlbmREYXRlKSB7CiAgICAgICAgICAgIHRoaXMuZW5kRGF0ZSA9IGVuZERhdGU7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvZGVSZWYoKSB7CiAgICAgICAgICAgIHJldHVybiBjb2RlUmVmOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIHZvaWQgc2V0Q29kZVJlZihTdHJpbmcgY29kZVJlZikgewogICAgICAgICAgICB0aGlzLmNvZGVSZWYgPSBjb2RlUmVmOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIEJpZ0RlY2ltYWwgZ2V0VmFsdWUoKSB7CiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKEJpZ0RlY2ltYWwgdmFsdWUpIHsKICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIEJpZ0RlY2ltYWwgZ2V0SW5jb21lKCkgewogICAgICAgICAgICByZXR1cm4gSW5jb21lOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIHZvaWQgc2V0SW5jb21lKEJpZ0RlY2ltYWwgaW5jb21lKSB7CiAgICAgICAgICAgIEluY29tZSA9IGluY29tZTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBCaWdEZWNpbWFsIGdldFJlZkluY29tZSgpIHsKICAgICAgICAgICAgcmV0dXJuIHJlZkluY29tZTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyB2b2lkIHNldFJlZkluY29tZShCaWdEZWNpbWFsIHJlZkluY29tZSkgewogICAgICAgICAgICB0aGlzLnJlZkluY29tZSA9IHJlZkluY29tZTsKICAgICAgICB9CgogICAgICAgIEBPdmVycmlkZQogICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlc3slcyAlcyAlcyAtIHZhbHVlOiAlcyBJbmNvbWU6ICVzfSIsIGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpLCBpbmNvbWVDb2RlLCBlbmREYXRlLCBjb2RlUmVmLCB2YWx1ZSwgSW5jb21lKTsKICAgICAgICB9CiAgICB9Cn0=