LH 매입임대 자료
한국토지주택공사(LH)에서 매입하여 임대하는 주택의 현황자료는
공공데이터포털에서 구할 수 있다.
위 링크에서 다운로드한 자료를 ./_raw 폴더에 저장하여
분석을 진행한다.
library(dplyr, quietly = T, warn.conflicts = F)
csvLst = list.files("./_raw", full.names = T, pattern = "csv$")
csvLst
[1] "./_raw/한국토지주택공사_(매입임대)마이홈포털 기존임대주택 목록_20250318.csv"
[2] "./_raw/한국토지주택공사_임대주택공급현황_매입임대_20241231.csv"
마이홈포털 자료를 읽으면 다음과 같다.
# 한국토지주택공사_(매입임대)마이홈포털 기존임대주택 목록
dat1 = read.csv2(csvLst[1], header = F, fileEncoding = "cp949", sep = ",", colClasses = rep("character", 19))
dat1
위 자료는 임대주택의 위치, 공급 세대수, 형명 및 공급면적, 임대료로
구성되어 있다. 공급 세대수는 형명에 따라 기재되지 않고 해당 주택의 전체
세대수가 각 형명에 반복 기재되어 있는 듯하다.
또한 임대사업자가 기재되어 있으며 다음과 같다.
dat1$V8 %>% .[2:length(.)] %>% unique()
[1] "LH서울" "SH공사" "부산도시공사" "LH부산울산" "LH대구경북"
[6] "대구도시개발공사" "인천도시공사" "LH인천" "LH광주전남" "광주광역시도시공사"
[11] "LH대전충남" "대전도시공사" "LH세종" "LH경기남부" "경기주택도시공사"
[16] "LH경기북부" "LH충북" "충남개발공사" "LH경남" "제주특별자치도개발공사"
[21] "LH제주" "LH강원" "LH전북"
위 자료에는 LH뿐만 아니라 지방공사가 공급하는 주택도
포함되어 있다.
임대주택공급현황자료를 읽으면 다음과 같다.
# 한국토지주택공사_임대주택공급현황_매입임대
dat2 = read.csv2(csvLst[2], header = F, fileEncoding = "cp949", sep = ",", colClasses = rep("character", 23))
dat2
위 자료는 임대주택의 위치, 동/호, 공급면적, 사용승인일, 매입년도,
테마형주택여부, 임대취득유형 등을 각 호실별로 기재한 듯하다. 짐작이
맞다면 공급 세대수는 행의 수와 같다.
한편, 기재된 임대사업자는 다음과 같다.
dat2$V2 %>% .[2:length(.)] %>% unique()
[1] "서울지역본부" "부산울산지역본부" "인천지역본부" "경기남부지역본부" "강원지역본부" "충북지역본부" "대전충남지역본부"
[8] "전북지역본부" "광주전남지역본부" "대구경북지역본부" "경남지역본부" "제주지역본부" "세종특별본부" "경기북부지역본부"
위 자료에 기재된 임대사업자는 모두 LH의 지역본부이다. 즉,
LH가 공급한 임대주택만 있는 자료이다.
한편, 임대취득유형을 살펴보면 다음과 같다.
dat2$V13 %>% .[2:length(.)] %>% unique()
[1] "청년매입임대" "주민공동시설등" "기존주택매입임대" "신혼·신생아매입임대"
[5] "신혼·신생아매입임대2" "상가" "기숙사형매입임대" "든든전세주택"
[9] "고령자임대" "다자녀임대" "청년신혼부부매입임대리츠" ""
[13] "일반리모델링" "해당없음"
임대취득유형 중 주택 외 부대시설인 주민공동시설등,
상가는 주택공급량 집계 때 제외한다.
LH 매입임대 공급량
위 두 자료로 LH에서 공급한 매입임대의 세대수를 계산하면 다음과
같다.
library(stringr, quietly = T, warn.conflicts = F)
sd_dat1 = dat1 %>% select(V4, V5, V6, V7, V8) %>% filter(str_detect(V8, "LH")) %>%
unique() %>% .$V6 %>% as.numeric() %>% sum(na.rm = T)
sd_dat2 = dat2 %>% .[2:nrow(.), ] %>% filter(!V13 %in% c("주민공동시설등", "상가")) %>% nrow()
bigFrm = function(x) formatC(x, format = "f", big.mark = ",", digits = 0)
cat(
paste0("마이홈포털 자료: ", bigFrm(sd_dat1), "\n",
"임대주택공급현황 자료: ", bigFrm(sd_dat2), "\n",
"자료 차이: ", bigFrm(abs(sd_dat2 - sd_dat1)), "\n")
)
마이홈포털 자료: 172,260
임대주택공급현황 자료: 182,862
자료 차이: 10,602
마이홈포털 자료가 1만 세대가량 작다. 두 자료에 차이가 있는 이유를
아래처럼 살펴본다.
마이홈포털자료(dat1)에 있으나 임대주택공급현황(dat2)에 없는
주택
마이홈포털자료(dat1)에 없으나 임대주택공급현황(dat2)에 있는
주택
각 주택별 공급량 차이
건축물대장과 불일치 : 주택 멸실 미반영, 기재오류 등
두 자료를 연결하여 비교하기 위한 고유값인 주소의
형식을 살펴보면 다음과 같다.
cat(
paste0("주소형식 대조\n",
"dat1 : ", dat1$V4[2], "\n",
"dat2 : ", dat2$V8[2], "\n")
)
주소형식을 살펴보면 dat1에는 기본주소(도로명 +
건물번호), dat2에는 상세주소(기본주소 + 건물명)가
기재되어 있는 듯하다.
dat1의 주소가 모두 기본주소 기반인지 살펴보면 다음과
같다.
dat1_juso = filter(dat1, str_detect(V8, "LH")) %>%
select(V4) %>% unique() %>%
mutate(base = str_extract(V4, "^[^(]*((길|로) [0-9\\-]+)")) # base에 기본주소 추출
dat1_juso %>% filter(is.na(base))
dat1의 주소에서 기본주소 형태를 찾기 어려운 행의 개수가 0이다. 즉,
모든 주소가 기본주소 기반이다.
dat2의 주소가 모두 기본주소 기반인지 살펴보면 다음과
같다.
dat2_juso = dat2[2:nrow(dat2), ] %>% filter(!V13 %in% c("주민공동시설등", "상가")) %>%
select(V8, V15) %>% unique() %>%
mutate(base = str_extract(V8, "^[^(]*((길|로) [0-9\\-]+)"))
names(dat2_juso) = c("기재주소", "사용승인일", "기본주소")
dat2_juso %>% filter(is.na(기본주소))
dat2의 주소 중 1개는 건물번호 누락, 3개는 지번주소로
기재되어 보완 및 수정이 필요하다.
주소정보누리집에서
영등포구 가마산로80가길을 검색하면
폐지주소로 나타난다. 사용승인일을 고려할 때 멸실주택으로 여겨진다.
2개 동(棟)으로 여겨지는 권선동 1022-1의 도로명주소는
경기도 수원시 권선구 권선로 719로 검색된다.
인계동 1024-2의 도로명주소는 경기도 수원시
팔달구 인계로94번길 39-16로 검색된다.
지금까지 검토한 결과를 다음과 같이 반영한다.
dat1_prime = dat1[2:nrow(dat1), ] %>%
mutate(base = str_extract(V4, "^[^(]*((길|로) [0-9\\-]+)"))
dat2_prime = dat2[2:nrow(dat2), ] %>%
mutate(base = str_extract(V8, "^[^(]*((길|로) [0-9\\-]+)"))
dat2_prime[dat2_prime$V8 %>%
str_detect("경기도 수원시 권선구 권선동 1022-1")
, ]$base = "경기도 수원시 권선구 권선로 719"
dat2_prime[dat2_prime$V8 == "경기도 수원시 팔달구 인계동 1024-2"
, ]$base = "경기도 수원시 팔달구 인계로94번길 39-16"
dat2_prime = dat2_prime %>% filter(!is.na(base)) # 영등포구 가마산로80가길 삭제
cat(
paste0("기본주소 확인\n",
"dat1_prime: ", dat1_prime$base[1], "\n",
"dat2_prime: ", dat2_prime$base[1])
)
기본주소 확인
dat1_prime: 서울특별시 종로구 난계로29길 13
dat2_prime: 서울특별시 종로구 난계로29길 13
마이홈포털자료(dat1)에 있으나 임대주택공급현황(dat2)에 없는
주택
기본주소를 매개로 \(D1 = dat1 -
dat2\)를 구하면 다음과 같다.
D1 = merge(
dat1_prime %>% select(base, V6) %>% unique() # V6(세대수)
, dat2_prime %>% select(base) %>% unique() %>% mutate(dat2 = T)
, by = "base", all.x = T
) %>% filter(is.na(dat2))
D1
cat(
paste0("D1 주택수: ", bigFrm(nrow(D1)), "개\n",
"D1 공급량: ", bigFrm(sum(as.numeric(D1$V6))), "가구·세대")
)
D1 주택수: 3,998개
D1 공급량: 46,448가구·세대
마이홈포털자료에 있으나 임대주택공급현황에 없는 주택은 3,998개이며,
공급량으로는 4.6만 가구·세대에 달한다.
마이홈포털자료(dat1)에 없으나 임대주택공급현황(dat2)에 있는
주택
기본주소를 매개로 \(D2 = dat2 -
dat1\)를 구하면 다음과 같다.
D2 = merge(
dat2_prime %>% select(base) %>%
group_by(base) %>% summarise(sd = n())
, dat1_prime %>% select(base) %>% unique() %>% mutate(dat1 = T)
, by = "base", all.x = T
) %>% filter(is.na(dat1))
D2
cat(
paste0("D2 주택수: ", bigFrm(nrow(D2)), "개\n",
"D2 공급량: ", bigFrm(sum(D2$sd)), "가구·세대")
)
D2 주택수: 746개
D2 공급량: 8,164가구·세대
마이홈포털자료에 없으나 임대주택공급현황에 없는 주택은 3,998개이며,
공급량으로는 4.6만 가구·세대에 달한다.
각 주택별 공급량 차이
기본주소를 매개로 \(D1.2 = dat1 \cap
dat2\)를 구하고 \(D1.2\)에
속하는 각 주택별 마이홈포털자료의 공급량과 임대주택공급현황의 공급량
차이를 구하면 다음과 같다.
D1.2 = merge(
dat1_prime %>% select(base, V6) %>% unique() %>%
mutate(sd1 = as.numeric(V6)) %>% select(-V6)
, dat2_prime %>% select(base) %>%
group_by(base) %>% summarise(sd2 = n())
, by = "base"
) %>% mutate(SDdiff = sd1 - sd2)
D1.2
D1.2_1BiggerThan2 = D1.2 %>% filter(SDdiff > 0)
D1.2_1BiggerThan2
D1.2_2BiggerThan1 = D1.2 %>% filter(SDdiff < 0)
D1.2_2BiggerThan1
cat(
paste0(
"D1.2(마이홈포털과 임대주택공급현황에 모두 기재)\n",
" - 주택수: ", bigFrm(nrow(D1.2)), "개\n",
" - 공급량(마이홈포털): ", bigFrm(sum(D1.2$sd1)), "가구·세대\n",
" - 공급량(임대주택공급현황): ", bigFrm(sum(D1.2$sd2)), "가구·세대\n",
"마이홈포털 > 임대주택공급현황\n",
" - 주택수: ", bigFrm(nrow(D1.2_1BiggerThan2)), "개\n",
" - 공급량(마이홈포털): ", bigFrm(sum(D1.2_1BiggerThan2$sd1)), "가구·세대\n",
" - 공급량(임대주택공급현황): ", bigFrm(sum(D1.2_1BiggerThan2$sd2)), "가구·세대\n",
" - 공급량 차이: ", bigFrm(sum(D1.2_1BiggerThan2$sd1) -
sum(D1.2_1BiggerThan2$sd2)), "가구·세대\n",
"마이홈포털 < 임대주택공급현황\n",
" - 주택수: ", bigFrm(nrow(D1.2_2BiggerThan1)), "개\n",
" - 공급량(마이홈포털): ", bigFrm(sum(D1.2_2BiggerThan1$sd1)), "가구·세대\n",
" - 공급량(임대주택공급현황): ", bigFrm(sum(D1.2_2BiggerThan1$sd2)), "가구·세대\n",
" - 공급량 차이: ", bigFrm(sum(D1.2_2BiggerThan1$sd2) -
sum(D1.2_2BiggerThan1$sd1)), "가구·세대\n"
)
)
D1.2(마이홈포털과 임대주택공급현황에 모두 기재)
- 주택수: 16,262개
- 공급량(마이홈포털): 167,191가구·세대
- 공급량(임대주택공급현황): 212,576가구·세대
마이홈포털 > 임대주택공급현황
- 주택수: 295개
- 공급량(마이홈포털): 7,723가구·세대
- 공급량(임대주택공급현황): 2,602가구·세대
- 공급량 차이: 5,121가구·세대
마이홈포털 < 임대주택공급현황
- 주택수: 3,135개
- 공급량(마이홈포털): 30,226가구·세대
- 공급량(임대주택공급현황): 80,732가구·세대
- 공급량 차이: 50,506가구·세대
각 자료에 기재된 공급량에 차이가 있는 것이 3.4천(295+3,135) 개가
넘는다. 이 중 마이홈포털 기재가 더 큰 것이 295개(공급량 차이 5,121),
임대주택공급현황 기재가 더 큰 것이 3,135개이다.
한쪽 자료에만 기재된 주택이 있고, 동일 주택의 공급량 기재가 자료에
따라 다른 이유는 아래처럼 여겨진다.
LS0tDQp0aXRsZTogIuyXsOq1rOuFuO2KuCjrp6TsnoXsnoTrjIDrtoTshJ0gMSk6TEgg66ek7J6F7J6E64yAIOqzteq4ie2YhO2ZqSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMjIyBMSCDrp6TsnoXsnoTrjIAg7J6Q66OMDQoNCu2VnOq1re2GoOyngOyjvO2DneqzteyCrChMSCnsl5DshJwg66ek7J6F7ZWY7JesIOyehOuMgO2VmOuKlCDso7ztg53snZgg7ZiE7Zmp7J6Q66OM64qUIOqzteqzteuNsOydtO2EsO2PrO2EuOyXkOyEnCDqtaztlaAg7IiYIOyeiOuLpC4NCg0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCnwg7J6Q66OMIOuqhSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCDrp4HtgawgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg7LWc7IugIOyekOujjCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kw0KfCDtlZzqta3thqDsp4Dso7ztg53qs7Xsgqxf7J6E64yA7KO87YOd6rO16riJ7ZiE7ZmpX+unpOyeheyehOuMgCAgICAgICAgICAgICAgIHwgPGh0dHBzOi8vd3d3LmRhdGEuZ28ua3IvZGF0YS8xNTExNzc1Ny9maWxlRGF0YS5kbz4gfCDtlZzqta3thqDsp4Dso7ztg53qs7Xsgqxf7J6E64yA7KO87YOd6rO16riJ7ZiE7ZmpX+unpOyeheyehOuMgF8yMDI0MTIzMS5jc3YgICAgICAgICAgICAgICB8DQp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAo7J207ZWYICoq7J6E64yA7KO87YOd6rO16riJ7ZiE7Zmp7J6Q66OMKiopICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQp8IO2VnOq1re2GoOyngOyjvO2DneqzteyCrFxfKOunpOyeheyehOuMgCnrp4jsnbTtmYjtj6zthLgg6riw7KG07J6E64yA7KO87YOdIOuqqeuhnSB8IDxodHRwczovL3d3dy5kYXRhLmdvLmtyL2RhdGEvMTUwODQ5MjcvZmlsZURhdGEuZG8+IHwg7ZWc6rWt7Yag7KeA7KO87YOd6rO17IKsXF8o66ek7J6F7J6E64yAKeuniOydtO2ZiO2PrO2EuCDquLDsobTsnoTrjIDso7ztg50g66qp66GdXzIwMjUwMzE4LmNzdiB8DQp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAo7J207ZWYICoq66eI7J207ZmI7Y+s7YS4IOyekOujjCoqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQoNCuychCDrp4Htgazsl5DshJwg64uk7Jq066Gc65Oc7ZWcIOyekOujjOulvCAqKi4vXF9yYXcqKiDtj7TrjZTsl5Ag7KCA7J6l7ZWY7JesIOu2hOyEneydhCDsp4TtlontlZzri6QuDQoNCmBgYHtyIOyekOujjCDsnITsuZgg7ZmV7J24fQ0KbGlicmFyeShkcGx5ciwgcXVpZXRseSA9IFQsIHdhcm4uY29uZmxpY3RzID0gRikNCmNzdkxzdCA9IGxpc3QuZmlsZXMoIi4vX3JhdyIsIGZ1bGwubmFtZXMgPSBULCBwYXR0ZXJuID0gImNzdiQiKQ0KY3N2THN0DQpgYGANCg0KKirrp4jsnbTtmYjtj6zthLgg7J6Q66OMKirrpbwg7J297Jy866m0IOuLpOydjOqzvCDqsJnri6QuDQoNCmBgYHtyIO2VnOq1re2GoOyngOyjvO2DneqzteyCrF8o66ek7J6F7J6E64yAKeuniOydtO2ZiO2PrO2EuCDquLDsobTsnoTrjIDso7ztg50g66qp66GdfQ0KIyDtlZzqta3thqDsp4Dso7ztg53qs7XsgqxfKOunpOyeheyehOuMgCnrp4jsnbTtmYjtj6zthLgg6riw7KG07J6E64yA7KO87YOdIOuqqeuhnQ0KZGF0MSA9IHJlYWQuY3N2Mihjc3ZMc3RbMV0sIGhlYWRlciA9IEYsIGZpbGVFbmNvZGluZyA9ICJjcDk0OSIsIHNlcCA9ICIsIiwgY29sQ2xhc3NlcyA9IHJlcCgiY2hhcmFjdGVyIiwgMTkpKQ0KZGF0MQ0KYGBgDQoNCuychCDsnpDro4zripQg7J6E64yA7KO87YOd7J2YIOychOy5mCwg6rO16riJIOyEuOuMgOyImCwg7ZiV66qFIOuwjyDqs7XquInrqbTsoIEsIOyehOuMgOujjOuhnCDqtazshLHrkJjslrQg7J6I64ukLiDqs7XquIkg7IS464yA7IiY64qUIO2YleuqheyXkCDrlLDrnbwg6riw7J6s65CY7KeAIOyViuqzoCDtlbTri7kg7KO87YOd7J2YIOyghOyytCDshLjrjIDsiJjqsIAg6rCBICoq7ZiV66qFKirsl5Ag67CY67O1IOq4sOyerOuQmOyWtCDsnojripQg65Ov7ZWY64ukLg0KDQrrmJDtlZwgKirsnoTrjIDsgqzsl4XsnpAqKuqwgCDquLDsnqzrkJjslrQg7J6I7Jy866mwIOuLpOydjOqzvCDqsJnri6QuDQoNCmBgYHtyIOuniOydtO2ZiO2PrO2EuCDsnpDro4zsnZgg7J6E64yA7IKs7JeF7J6QIOq1rOu2hCwgbWVzc2FnZT1UUlVFfQ0KZGF0MSRWOCAlPiUgLlsyOmxlbmd0aCguKV0gJT4lIHVuaXF1ZSgpDQpgYGANCg0K7JyEIOyekOujjOyXkOuKlCBMSOu/kOunjCDslYTri4jrnbwgKirsp4DrsKnqs7XsgqwqKuqwgCDqs7XquIntlZjripQg7KO87YOd64+EIO2PrO2VqOuQmOyWtCDsnojri6QuDQoNCioq7J6E64yA7KO87YOd6rO16riJ7ZiE7Zmp7J6Q66OMKirrpbwg7J297Jy866m0IOuLpOydjOqzvCDqsJnri6QuDQoNCmBgYHtyIO2VnOq1re2GoOyngOyjvO2DneqzteyCrF/snoTrjIDso7ztg53qs7XquIntmITtmalf66ek7J6F7J6E64yAfQ0KIyDtlZzqta3thqDsp4Dso7ztg53qs7Xsgqxf7J6E64yA7KO87YOd6rO16riJ7ZiE7ZmpX+unpOyeheyehOuMgA0KZGF0MiA9IHJlYWQuY3N2Mihjc3ZMc3RbMl0sIGhlYWRlciA9IEYsIGZpbGVFbmNvZGluZyA9ICJjcDk0OSIsIHNlcCA9ICIsIiwgY29sQ2xhc3NlcyA9IHJlcCgiY2hhcmFjdGVyIiwgMjMpKQ0KZGF0Mg0KYGBgDQoNCuychCDsnpDro4zripQg7J6E64yA7KO87YOd7J2YIOychOy5mCwg64+ZL+2YuCwg6rO16riJ66m07KCBLCDsgqzsmqnsirnsnbjsnbwsIOunpOyeheuFhOuPhCwg7YWM66eI7ZiV7KO87YOd7Jes67aALCDsnoTrjIDst6jrk53snKDtmJUg65Ox7J2EIOqwgSDtmLjsi6Trs4TroZwg6riw7J6s7ZWcIOuTr+2VmOuLpC4g7KeQ7J6R7J20IOunnuuLpOuptCAqKuqzteq4iSDshLjrjIDsiJjripQg7ZaJ7J2YIOyImCoq7JmAIOqwmeuLpC4NCg0K7ZWc7Y64LCDquLDsnqzrkJwgKirsnoTrjIDsgqzsl4XsnpAqKuuKlCDri6TsnYzqs7wg6rCZ64ukLg0KDQpgYGB7ciDtlZzqta3thqDsp4Dso7ztg53qs7Xsgqxf7J6E64yA7KO87YOd6rO16riJ7ZiE7Zmp7J2YIOyehOuMgOyCrOyXheyekCDqtazrtoR9DQpkYXQyJFYyICU+JSAuWzI6bGVuZ3RoKC4pXSAlPiUgdW5pcXVlKCkNCmBgYA0KDQrsnIQg7J6Q66OM7JeQIOq4sOyerOuQnCDsnoTrjIDsgqzsl4XsnpDripQg66qo65GQIExI7J2YIOyngOyXreuzuOu2gOydtOuLpC4g7KaJLCAqKkxI6rCAIOqzteq4ie2VnCDsnoTrjIDso7ztg50qKuunjCDsnojripQg7J6Q66OM7J2064ukLg0KDQrtlZztjrgsICoq7J6E64yA7Leo65Od7Jyg7ZiVKirsnYQg7IK07Y6067O066m0IOuLpOydjOqzvCDqsJnri6QuDQoNCmBgYHtyIO2VnOq1re2GoOyngOyjvO2DneqzteyCrF/snoTrjIDso7ztg53qs7XquIntmITtmansnZgg7J6E64yA7Leo65Od7Jyg7ZiVIOq1rOu2hH0NCmRhdDIkVjEzICU+JSAuWzI6bGVuZ3RoKC4pXSAlPiUgdW5pcXVlKCkNCmBgYA0KDQrsnoTrjIDst6jrk53snKDtmJUg7KSRIOyjvO2DnSDsmbgg67aA64yA7Iuc7ISk7J24ICoq7KO866+86rO164+Z7Iuc7ISk65OxKiosICoq7IOB6rCAKirripQg7KO87YOd6rO16riJ65+JIOynkeqzhCDrlYwg7KCc7Jm47ZWc64ukLg0KDQojIyMgTEgg66ek7J6F7J6E64yAIOqzteq4ieufiQ0KDQrsnIQg65GQIOyekOujjOuhnCBMSOyXkOyEnCDqs7XquIntlZwg66ek7J6F7J6E64yA7J2YIOyEuOuMgOyImOulvCDqs4TsgrDtlZjrqbQg64uk7J2M6rO8IOqwmeuLpC4NCg0KYGBge3Ig6rO16riJ7IS464yA7IiYfQ0KbGlicmFyeShzdHJpbmdyLCBxdWlldGx5ID0gVCwgd2Fybi5jb25mbGljdHMgPSBGKQ0Kc2RfZGF0MSA9IGRhdDEgJT4lIHNlbGVjdChWNCwgVjUsIFY2LCBWNywgVjgpICU+JSBmaWx0ZXIoc3RyX2RldGVjdChWOCwgIkxIIikpICU+JSANCiAgdW5pcXVlKCkgJT4lIC4kVjYgJT4lIGFzLm51bWVyaWMoKSAlPiUgc3VtKG5hLnJtID0gVCkgDQpzZF9kYXQyID0gZGF0MiAlPiUgLlsyOm5yb3coLiksIF0gJT4lIGZpbHRlcighVjEzICVpbiUgYygi7KO866+86rO164+Z7Iuc7ISk65OxIiwgIuyDgeqwgCIpKSAlPiUgbnJvdygpDQpiaWdGcm0gPSBmdW5jdGlvbih4KSBmb3JtYXRDKHgsIGZvcm1hdCA9ICJmIiwgYmlnLm1hcmsgPSAiLCIsIGRpZ2l0cyA9IDApDQpjYXQoDQogIHBhc3RlMCgi66eI7J207ZmI7Y+s7YS4IOyekOujjDogICAgICAgIiwgIGJpZ0ZybShzZF9kYXQxKSwgIlxuIiwNCiAgICAgICAgICLsnoTrjIDso7ztg53qs7XquIntmITtmakg7J6Q66OMOiAiLCAgYmlnRnJtKHNkX2RhdDIpLCAiXG4iLA0KICAgICAgICAgIuyekOujjCDssKjsnbQ6ICAgICAgICAgICAgICAiLCBiaWdGcm0oYWJzKHNkX2RhdDIgLSBzZF9kYXQxKSksICJcbiIpDQopDQpgYGANCg0K66eI7J207ZmI7Y+s7YS4IOyekOujjOqwgCAx66eMIOyEuOuMgOqwgOufiSDsnpHri6QuIOuRkCDsnpDro4zsl5Ag7LCo7J206rCAIOyeiOuKlCDsnbTsnKDrpbwg7JWE656Y7LKY65+8IOyCtO2OtOuzuOuLpC4NCg0KLSAgIOuniOydtO2ZiO2PrO2EuOyekOujjChkYXQxKeyXkCDsnojsnLzrgpgg7J6E64yA7KO87YOd6rO16riJ7ZiE7ZmpKGRhdDIp7JeQIOyXhuuKlCDso7ztg50NCg0KLSAgIOuniOydtO2ZiO2PrO2EuOyekOujjChkYXQxKeyXkCDsl4bsnLzrgpgg7J6E64yA7KO87YOd6rO16riJ7ZiE7ZmpKGRhdDIp7JeQIOyeiOuKlCDso7ztg50NCg0KLSAgIOqwgSDso7ztg53rs4Qg6rO16riJ65+JIOywqOydtA0KDQotICAg6rG07LaV66y864yA7J6l6rO8IOu2iOydvOy5mCA6IOyjvO2DnSDrqbjsi6Qg66+467CY7JiBLCDquLDsnqzsmKTrpZgg65OxDQoNCuuRkCDsnpDro4zrpbwg7Jew6rKw7ZWY7JesIOu5hOq1kO2VmOq4sCDsnITtlZwg6rOg7Jyg6rCS7J24ICoq7KO87IaMKirsnZgg7ZiV7Iud7J2EIOyCtO2OtOuztOuptCDri6TsnYzqs7wg6rCZ64ukLg0KDQpgYGB7ciBkYXQxLCBkYXQy7J2YIOyjvOyGjCDtmJXtg5x9DQpjYXQoDQogIHBhc3RlMCgi7KO87IaM7ZiV7IudIOuMgOyhsFxuIiwgDQogICAgICAgICAiZGF0MSA6ICIsIGRhdDEkVjRbMl0sICJcbiIsDQogICAgICAgICAiZGF0MiA6ICIsIGRhdDIkVjhbMl0sICJcbiIpDQopDQpgYGANCg0K7KO87IaM7ZiV7Iud7J2EIOyCtO2OtOuztOuptCBkYXQx7JeQ64qUICoq6riw67O47KO87IaMKioo64+E66Gc66qFICsg6rG066y867KI7Zi4KSwgZGF0MuyXkOuKlCAqKuyDgeyEuOyjvOyGjCoqKOq4sOuzuOyjvOyGjCArIOqxtOusvOuqhSnqsIAg6riw7J6s65CY7Ja0IOyeiOuKlCDrk6/tlZjri6QuDQoNCmRhdDHsnZgg7KO87IaM6rCAIOuqqOuRkCAqKuq4sOuzuOyjvOyGjCDquLDrsJgqKuyduOyngCDsgrTtjrTrs7TrqbQg64uk7J2M6rO8IOqwmeuLpC4NCg0KYGBge3IgZGF0MSDso7zshozsl5DshJwg6riw67O47KO87IaMIOy2lOy2nH0NCmRhdDFfanVzbyA9IGZpbHRlcihkYXQxLCBzdHJfZGV0ZWN0KFY4LCAiTEgiKSkgJT4lIA0KICBzZWxlY3QoVjQpICU+JSB1bmlxdWUoKSAlPiUgDQogIG11dGF0ZShiYXNlID0gc3RyX2V4dHJhY3QoVjQsICJeW14oXSooKOq4uHzroZwpIFswLTlcXC1dKykiKSkgIyBiYXNl7JeQIOq4sOuzuOyjvOyGjCDstpTstpwNCmRhdDFfanVzbyAlPiUgZmlsdGVyKGlzLm5hKGJhc2UpKQ0KYGBgDQoNCmRhdDHsnZgg7KO87IaM7JeQ7IScIOq4sOuzuOyjvOyGjCDtmJXtg5zrpbwg7LC+6riwIOyWtOugpOyatCDtlonsnZgg6rCc7IiY6rCAIDDsnbTri6QuIOymiSwg66qo65OgIOyjvOyGjOqwgCDquLDrs7jso7zshowg6riw67CY7J2064ukLg0KDQpkYXQy7J2YIOyjvOyGjOqwgCDrqqjrkZAgKirquLDrs7jso7zshowg6riw67CYKirsnbjsp4Ag7IK07Y6067O066m0IOuLpOydjOqzvCDqsJnri6QuDQoNCmBgYHtyIGRhdDIg7KO87IaM7JeQ7IScIOq4sOuzuOyjvOyGjCDstpTstpx9DQpkYXQyX2p1c28gPSBkYXQyWzI6bnJvdyhkYXQyKSwgXSAlPiUgZmlsdGVyKCFWMTMgJWluJSBjKCLso7zrr7zqs7Xrj5nsi5zshKTrk7EiLCAi7IOB6rCAIikpICU+JSANCiAgc2VsZWN0KFY4LCBWMTUpICU+JSB1bmlxdWUoKSAlPiUgDQogIG11dGF0ZShiYXNlID0gc3RyX2V4dHJhY3QoVjgsICJeW14oXSooKOq4uHzroZwpIFswLTlcXC1dKykiKSkNCm5hbWVzKGRhdDJfanVzbykgPSBjKCLquLDsnqzso7zshowiLCAi7IKs7Jqp7Iq57J247J28IiwgIuq4sOuzuOyjvOyGjCIpDQpkYXQyX2p1c28gJT4lIGZpbHRlcihpcy5uYSjquLDrs7jso7zshowpKQ0KYGBgDQoNCmRhdDLsnZgg7KO87IaMIOykkSAx6rCc64qUIOqxtOusvOuyiO2YuCDriITrnb0sIDPqsJzripQgKirsp4Drsojso7zshowqKuuhnCDquLDsnqzrkJjslrQg67O07JmEIOuwjyDsiJjsoJXsnbQg7ZWE7JqU7ZWY64ukLg0KDQpb7KO87IaM7KCV67O064iE66as7KeRXShodHRwczovL3d3dy5qdXNvLmdvLmtyKeyXkOyEnCAqKuyYgeuTse2PrOq1rCoqICoq6rCA66eI7IKw66GcODDqsIDquLgqKuydhCDqsoDsg4ntlZjrqbQg7Y+Q7KeA7KO87IaM66GcIOuCmO2DgOuCnOuLpC4g7IKs7Jqp7Iq57J247J287J2EIOqzoOugpO2VoCDrlYwg66m47Iuk7KO87YOd7Jy866GcIOyXrOqyqOynhOuLpC4NCg0KMuqwnCDrj5ko5qOfKeycvOuhnCDsl6zqsqjsp4DripQgKirqtozshKDrj5kgMTAyMi0xKirsnZgg64+E66Gc66qF7KO87IaM64qUICoq6rK96riw64+EIOyImOybkOyLnCDqtozshKDqtawg6raM7ISg66GcIDcxOSoq66GcIOqygOyDieuQnOuLpC4NCg0KKirsnbjqs4Trj5kgMTAyNC0yKirsnZgg64+E66Gc66qF7KO87IaM64qUICoq6rK96riw64+EIOyImOybkOyLnCDtjJTri6zqtawg7J246rOE66GcOTTrsojquLggMzktMTYqKuuhnCDqsoDsg4nrkJzri6QuDQoNCuyngOq4iOq5jOyngCDqsoDthqDtlZwg6rKw6rO866W8IOuLpOydjOqzvCDqsJnsnbQg67CY7JiB7ZWc64ukLg0KDQpgYGB7ciDso7zshowg6rKA7YagIOqysOqzvCDrsJjsmIF9DQpkYXQxX3ByaW1lID0gZGF0MVsyOm5yb3coZGF0MSksIF0gJT4lIA0KICBtdXRhdGUoYmFzZSA9IHN0cl9leHRyYWN0KFY0LCAiXlteKF0qKCjquLh866GcKSBbMC05XFwtXSspIikpDQpkYXQyX3ByaW1lID0gZGF0MlsyOm5yb3coZGF0MiksIF0gJT4lIA0KICBtdXRhdGUoYmFzZSA9IHN0cl9leHRyYWN0KFY4LCAiXlteKF0qKCjquLh866GcKSBbMC05XFwtXSspIikpDQpkYXQyX3ByaW1lW2RhdDJfcHJpbWUkVjggJT4lIA0KICAgICAgICAgICAgIHN0cl9kZXRlY3QoIuqyveq4sOuPhCDsiJjsm5Dsi5wg6raM7ISg6rWsIOq2jOyEoOuPmSAxMDIyLTEiKQ0KICAgICAgICAgICAsIF0kYmFzZSA9ICLqsr3quLDrj4Qg7IiY7JuQ7IucIOq2jOyEoOq1rCDqtozshKDroZwgNzE5Ig0KZGF0Ml9wcmltZVtkYXQyX3ByaW1lJFY4ID09ICLqsr3quLDrj4Qg7IiY7JuQ7IucIO2MlOuLrOq1rCDsnbjqs4Trj5kgMTAyNC0yIg0KICAgICAgICAgICAsIF0kYmFzZSA9ICLqsr3quLDrj4Qg7IiY7JuQ7IucIO2MlOuLrOq1rCDsnbjqs4TroZw5NOuyiOq4uCAzOS0xNiINCmRhdDJfcHJpbWUgPSBkYXQyX3ByaW1lICU+JSBmaWx0ZXIoIWlzLm5hKGJhc2UpKSAjIOyYgeuTse2PrOq1rCDqsIDrp4jsgrDroZw4MOqwgOq4uCDsgq3soJwNCmNhdCgNCiAgcGFzdGUwKCLquLDrs7jso7zshowg7ZmV7J24XG4iLA0KICAiZGF0MV9wcmltZTogIiwgZGF0MV9wcmltZSRiYXNlWzFdLCAiXG4iLCANCiAgImRhdDJfcHJpbWU6ICIsIGRhdDJfcHJpbWUkYmFzZVsxXSkNCikNCmBgYA0KDQojIyMjIOuniOydtO2ZiO2PrO2EuOyekOujjChkYXQxKeyXkCDsnojsnLzrgpgg7J6E64yA7KO87YOd6rO16riJ7ZiE7ZmpKGRhdDIp7JeQIOyXhuuKlCDso7ztg50NCg0K6riw67O47KO87IaM66W8IOunpOqwnOuhnCAkRDEgPSBkYXQxIC0gZGF0MiTrpbwg6rWs7ZWY66m0IOuLpOydjOqzvCDqsJnri6QuDQoNCmBgYHtyIGRhdDHsl5Ag7J6I7Jy864KYIGRhdDLsl5Ag7JeG64qUIOyjvO2DnX0NCkQxID0gbWVyZ2UoDQogIGRhdDFfcHJpbWUgJT4lIHNlbGVjdChiYXNlLCBWNikgJT4lIHVuaXF1ZSgpICMgVjYo7IS464yA7IiYKQ0KICAsIGRhdDJfcHJpbWUgJT4lIHNlbGVjdChiYXNlKSAlPiUgdW5pcXVlKCkgJT4lIG11dGF0ZShkYXQyID0gVCkNCiAgLCBieSA9ICJiYXNlIiwgYWxsLnggPSBUDQopICU+JSBmaWx0ZXIoaXMubmEoZGF0MikpDQpEMQ0KY2F0KA0KICBwYXN0ZTAoIkQxIOyjvO2DneyImDogICIsIGJpZ0ZybShucm93KEQxKSksICLqsJxcbiIsDQogICAgICAgICAiRDEg6rO16riJ65+JOiAiLCBiaWdGcm0oc3VtKGFzLm51bWVyaWMoRDEkVjYpKSksICLqsIDqtazCt+yEuOuMgCIpDQopDQpgYGANCg0K66eI7J207ZmI7Y+s7YS47J6Q66OM7JeQIOyeiOycvOuCmCDsnoTrjIDso7ztg53qs7XquIntmITtmansl5Ag7JeG64qUIOyjvO2DneydgCAzLDk5OOqwnOydtOupsCwg6rO16riJ65+J7Jy866Gc64qUIDQuNuunjCDqsIDqtazCt+yEuOuMgOyXkCDri6ztlZzri6QuDQoNCiMjIyMg66eI7J207ZmI7Y+s7YS47J6Q66OMKGRhdDEp7JeQIOyXhuycvOuCmCDsnoTrjIDso7ztg53qs7XquIntmITtmakoZGF0Minsl5Ag7J6I64qUIOyjvO2DnQ0KDQrquLDrs7jso7zshozrpbwg66ek6rCc66GcICREMiA9IGRhdDIgLSBkYXQxJOulvCDqtaztlZjrqbQg64uk7J2M6rO8IOqwmeuLpC4NCg0KYGBge3IgZGF0MeyXkCDsl4bsnLzrgpggZGF0MuyXkCDsnojripQg7KO87YOdfQ0KRDIgPSBtZXJnZSgNCiAgZGF0Ml9wcmltZSAlPiUgc2VsZWN0KGJhc2UpICU+JSANCiAgICBncm91cF9ieShiYXNlKSAlPiUgc3VtbWFyaXNlKHNkID0gbigpKQ0KICAsIGRhdDFfcHJpbWUgJT4lIHNlbGVjdChiYXNlKSAlPiUgdW5pcXVlKCkgJT4lIG11dGF0ZShkYXQxID0gVCkNCiAgLCBieSA9ICJiYXNlIiwgYWxsLnggPSBUDQopICU+JSBmaWx0ZXIoaXMubmEoZGF0MSkpDQpEMg0KY2F0KA0KICBwYXN0ZTAoIkQyIOyjvO2DneyImDogICAiLCBiaWdGcm0obnJvdyhEMikpLCAi6rCcXG4iLA0KICAgICAgICAgIkQyIOqzteq4ieufiTogIiwgYmlnRnJtKHN1bShEMiRzZCkpLCAi6rCA6rWswrfshLjrjIAiKQ0KKQ0KYGBgDQoNCuuniOydtO2ZiO2PrO2EuOyekOujjOyXkCDsl4bsnLzrgpgg7J6E64yA7KO87YOd6rO16riJ7ZiE7Zmp7JeQIOyXhuuKlCDso7ztg53snYAgMyw5OTjqsJzsnbTrqbAsIOqzteq4ieufieycvOuhnOuKlCA0Ljbrp4wg6rCA6rWswrfshLjrjIDsl5Ag64us7ZWc64ukLg0KDQojIyMjIOqwgSDso7ztg53rs4Qg6rO16riJ65+JIOywqOydtA0KDQrquLDrs7jso7zshozrpbwg66ek6rCc66GcICREMS4yID0gZGF0MSBcY2FwIGRhdDIk66W8IOq1rO2VmOqzoCAkRDEuMiTsl5Ag7IaN7ZWY64qUIOqwgSDso7ztg53rs4Qg66eI7J207ZmI7Y+s7YS47J6Q66OM7J2YIOqzteq4ieufieqzvCDsnoTrjIDso7ztg53qs7XquIntmITtmansnZgg6rO16riJ65+JIOywqOydtOulvCDqtaztlZjrqbQg64uk7J2M6rO8IOqwmeuLpC4NCg0KYGBge3Ig6rCBIOyjvO2DneuzhCDqs7XquInrn4kg7LCo7J20fQ0KRDEuMiA9IG1lcmdlKA0KICBkYXQxX3ByaW1lICU+JSBzZWxlY3QoYmFzZSwgVjYpICU+JSB1bmlxdWUoKSAlPiUgDQogICAgbXV0YXRlKHNkMSA9IGFzLm51bWVyaWMoVjYpKSAlPiUgc2VsZWN0KC1WNikNCiAgLCBkYXQyX3ByaW1lICU+JSBzZWxlY3QoYmFzZSkgJT4lIA0KICAgIGdyb3VwX2J5KGJhc2UpICU+JSBzdW1tYXJpc2Uoc2QyID0gbigpKQ0KICAsIGJ5ID0gImJhc2UiDQopICU+JSBtdXRhdGUoU0RkaWZmID0gc2QxIC0gc2QyKQ0KRDEuMg0KRDEuMl8xQmlnZ2VyVGhhbjIgPSBEMS4yICU+JSBmaWx0ZXIoU0RkaWZmID4gMCkNCkQxLjJfMUJpZ2dlclRoYW4yDQpEMS4yXzJCaWdnZXJUaGFuMSA9IEQxLjIgJT4lIGZpbHRlcihTRGRpZmYgPCAwKQ0KRDEuMl8yQmlnZ2VyVGhhbjENCmNhdCgNCiAgcGFzdGUwKA0KICAgICJEMS4yKOuniOydtO2ZiO2PrO2EuOqzvCDsnoTrjIDso7ztg53qs7XquIntmITtmansl5Ag66qo65GQIOq4sOyerClcbiIsIA0KICAgICIgLSDso7ztg53siJg6ICAgICAgICAgICAgICAgICAgICAiLCBiaWdGcm0obnJvdyhEMS4yKSksICLqsJxcbiIsDQogICAgIiAtIOqzteq4ieufiSjrp4jsnbTtmYjtj6zthLgpOiAgICAgICAiLCBiaWdGcm0oc3VtKEQxLjIkc2QxKSksICLqsIDqtazCt+yEuOuMgFxuIiwNCiAgICAiIC0g6rO16riJ65+JKOyehOuMgOyjvO2Dneqzteq4ie2YhO2ZqSk6ICIsIGJpZ0ZybShzdW0oRDEuMiRzZDIpKSwgIuqwgOq1rMK37IS464yAXG4iLA0KICAgICLrp4jsnbTtmYjtj6zthLggPiDsnoTrjIDso7ztg53qs7XquIntmITtmalcbiIsDQogICAgIiAtIOyjvO2DneyImDogICAgICAgICAgICAgICAgICAgICAiLCBiaWdGcm0obnJvdyhEMS4yXzFCaWdnZXJUaGFuMikpLCAi6rCcXG4iLA0KICAgICIgLSDqs7XquInrn4ko66eI7J207ZmI7Y+s7YS4KTogICAgICAgIiwgYmlnRnJtKHN1bShEMS4yXzFCaWdnZXJUaGFuMiRzZDEpKSwgIuqwgOq1rMK37IS464yAXG4iLA0KICAgICIgLSDqs7XquInrn4ko7J6E64yA7KO87YOd6rO16riJ7ZiE7ZmpKTogIiwgYmlnRnJtKHN1bShEMS4yXzFCaWdnZXJUaGFuMiRzZDIpKSwgIuqwgOq1rMK37IS464yAXG4iLA0KICAgICIgLSDqs7XquInrn4kg7LCo7J20OiAgICAgICAgICAgICAgIiwgYmlnRnJtKHN1bShEMS4yXzFCaWdnZXJUaGFuMiRzZDEpIC0gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bShEMS4yXzFCaWdnZXJUaGFuMiRzZDIpKSwgIuqwgOq1rMK37IS464yAXG4iLA0KICAgICLrp4jsnbTtmYjtj6zthLggPCDsnoTrjIDso7ztg53qs7XquIntmITtmalcbiIsDQogICAgIiAtIOyjvO2DneyImDogICAgICAgICAgICAgICAgICAgICIsIGJpZ0ZybShucm93KEQxLjJfMkJpZ2dlclRoYW4xKSksICLqsJxcbiIsDQogICAgIiAtIOqzteq4ieufiSjrp4jsnbTtmYjtj6zthLgpOiAgICAgICAiLCBiaWdGcm0oc3VtKEQxLjJfMkJpZ2dlclRoYW4xJHNkMSkpLCAi6rCA6rWswrfshLjrjIBcbiIsDQogICAgIiAtIOqzteq4ieufiSjsnoTrjIDso7ztg53qs7XquIntmITtmakpOiAiLCBiaWdGcm0oc3VtKEQxLjJfMkJpZ2dlclRoYW4xJHNkMikpLCAi6rCA6rWswrfshLjrjIBcbiIsDQogICAgIiAtIOqzteq4ieufiSDssKjsnbQ6ICAgICAgICAgICAgICAiLCBiaWdGcm0oc3VtKEQxLjJfMkJpZ2dlclRoYW4xJHNkMikgLSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtKEQxLjJfMkJpZ2dlclRoYW4xJHNkMSkpLCAi6rCA6rWswrfshLjrjIBcbiINCiAgKQ0KKQ0KYGBgDQoNCuqwgSDsnpDro4zsl5Ag6riw7J6s65CcIOqzteq4ieufieyXkCDssKjsnbTqsIAg7J6I64qUIOqyg+ydtCAzLjTsspwoMjk1KzMsMTM1KSDqsJzqsIAg64SY64qU64ukLiDsnbQg7KSRIOuniOydtO2ZiO2PrO2EuCDquLDsnqzqsIAg642UIO2BsCDqsoPsnbQgMjk16rCcKOqzteq4ieufiSDssKjsnbQgNSwxMjEpLCDsnoTrjIDso7ztg53qs7XquIntmITtmakg6riw7J6s6rCAIOuNlCDtgbAg6rKD7J20IDMsMTM16rCc7J2064ukLg0KDQrtlZzsqr0g7J6Q66OM7JeQ66eMIOq4sOyerOuQnCDso7ztg53snbQg7J6I6rOgLCDrj5nsnbwg7KO87YOd7J2YIOqzteq4ieufiSDquLDsnqzqsIAg7J6Q66OM7JeQIOuUsOudvCDri6Trpbgg7J207Jyg64qUIOyVhOuemOyymOufvCDsl6zqsqjsp4Tri6QuDQoNCi0gICDsnITsuZjrpbwg6riw67O47KO87IaM66eM7Jy866GcIO2RnOq4sO2VmOuptCDsl6zrn6wg64+Z7J20IOyeiOuKlCDso7ztg50g7KeR6rOEIOuVjCDsmKTrpZjrsJzsg50g7Jqw66CkIOyeiOydjA0KDQotICAg7J2066+4IOupuOyLpOuQnCDso7ztg53snbQg6rOE7IaNIOyekOujjOyXkCDrgqjslYQg7J6I7J2EIOyImCDsnojsnYwo7KO87YOdIOupuOyLpCDrr7jrsJjsmIEpDQoNCi0gICDri6jsiJwg64iE6529LCDquLDsnqwg7Jik66WYIOuTsQ0KDQojIyMg64uk7J2MIOu2hOyEnSAuLi4NCg0KLSAgIOqxtOy2leusvOuMgOyepeqzvCDrtojsnbzsuZgg7KO87YOdIO2ZleyduCA6IOyjvO2DnSDrqbjsi6Qg66+467CY7JiBLCDquLDsnqzsmKTrpZgg65OxDQoNCi0gICDrp6TsnoXqs7Xqs7XsnoTrjIAg67aE7Y+sDQo=